本文为【Mysql索引八股文合集】初版,后续还会进行优化更新,欢迎大家关注交流~
hello hello~ ,这里是绝命Coding——老白~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹
💥个人主页:绝命Coding-优快云博客
💥 所属专栏:后端技术分享
这里将会不定期更新有关后端、前端的内容,希望大家多多点赞关注收藏💖
更多历史精彩文章(篇幅过多,不一一列出):
(简历相关)
求职经验分享(1):一份合格的简历应该如何写?-优快云博客(推荐)
求职经验分享(2):简历如何优化以及如何应对面试【后端篇】-优快云博客
(项目亮点相关)
大厂面试官赞不绝口的后端技术亮点【后端项目亮点合集(1):Redis篇】-优快云博客
大厂面试官赞不绝口的后端技术亮点【后端项目亮点合集(2)】-优快云博客
(八股文)
大厂面试官问我:Redis处理点赞,如果瞬时涌入大量用户点赞(千万级),应当如何进行处理?【后端八股文一:Redis点赞八股文合集】_java中redis如何实现点赞-优快云博客大厂面试官问我:布隆过滤器有不能扩容和删除的缺陷,有没有可以替代的数据结构呢?【后端八股文二:布隆过滤器八股文合集】_布隆过滤器不能扩容-优快云博客
………
MySQL的索引数据结构
索引是一种建立在特定列上的数据结构,索引的原理是把无序的数据变为有序的查询
- mysql索引的数据结构是树,常用的存储引擎innodb采用的是
B+树 - 非关系型数据库MongoDB使用
B树作为数据库索引
B-Tree 是最常用的用于索引的数据结构。因为它们是时间复杂度低, 查找、删除、插入操作都可以可以在对数时间内完成。另外一个重要原因存储在B-Tree中的数据是有序的。
索引
- 索引是存储引擎用于提高数据库表的访问速度的一种数据结构
优点:
- 为了提高数据的查询效率
- 加快分组和排序的速度(为排序或者分组的字段加索引)
- 加快表与表之间的连接
缺点
- 建立索引需要占用物理空间
- 会降低表的增删改效率,因为每次增删改,需要动态维护索引,导致增删改时间变长
建立原则
- 最频繁使用的、用以缩小查询范围的字段
- 频繁使用的、需要排序的字段
不适合
- where中用不到的字段
- 表记录较少
- 需要经常增删改
- 参与列计算的列
- 区分度不高的,比如性别男女
(索引检索靠磁盘IO操作,好的索引减少磁盘IO操作次数)
一般来说,索引本身也很大,不可能全部存储在内存中,
一般以文件形式存储在磁盘上,索引检索需要磁盘I/O操作。
判断一种数据结构作为索引的优劣主要是看在查询过程中的磁盘IO渐进复杂度,一个好的索引应该是尽量减少磁盘IO操作次数
索引优化的方法
(1)like语句的前导模糊查询不能使用索引
(2)负向条件查询不能使用索引,有时候考虑优化成in
(3)联合索引最左前缀原则,区分度最高的字段在最左边
(4)不要在索引列上面做任何操作(计算、函数),否则会导致索引失效而转向全表扫描
(5)索引不会包含有NULL值的列,
复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时,尽量使用not null 约束以及默认值。
(6)如果有order by、group by的场景,请注意利用索引的有序性
例如对于语句 where a=? and b=? order by c,可以建立联合索引(a,b,c)。
(7)使用短索引
根据实际文本区分度决定索引长度即可
(8)如果明确知道只有一条结果返回,limit 1 能够提高效率
select * from user where login_name=? limit 1
自己明确知道只有一条结果,但数据库并不知道,明确告诉它,让它主动停止游标移动。
(9)超过三个表最好不要 join
- 需要 join 的字段,数据类型必须一致,多表关联查询时,保证被关联的字段需要有索引。
- 例如:
left join是由左边决定的,左边的数据一定都有,所以右边是我们的关键点,建立索引要建右边的。当然如果索引在左边,可以用right join。
深层原因
1. 使用聚合函数
使用了聚合函数后,不再是索引的递增顺序了,因此不能使用索引
优化器的偷懒行为
对于select * from tradelog where id + 1 = 10000这个SQL语句,这个加1操作并不会改变有序性,但是MySQL优化器还是不能用id索引快速定位到9999这一行。所以,需要


最低0.47元/天 解锁文章
2021





