MySQL中索引部分是面试官最常问道的,索引说破天就是充当书的目录的作用,提高查询效率,但是面试的时候这样回答不够优雅,如何让面试官眼前一亮
关于MySQL索引的面试题目,我总结了如下思维导图,需要完整MySQL的面试思维导图可以私信我领取,也可以持续关注我的MySQL专栏,我会继续分享MySQL相关面试题,助力大家在面试时被问到MySQL轻松拿下
一、明确的前提
索引不是万能的,索引并不适用于所有场景,也不能说索引越多越好。索引固然可以提高查询速度,但是索引同样也有缺点,比如:
- 索引需要占用磁盘空间,数量越多,占用的磁盘空间越大
- 创建和维护索引要耗费时间,时间随着数据量的增加而增大
- 插入、更新和删除操作性能下降:当创建一个索引时,数据库在执行增删改操作时,不仅要对表中数据进行维护,还需要对相关索引进行维护
索引的设计也有一些原则:
- 选择区分度高的列作为索引(不要选择性别这样区分度极低的列作为索引)
- order by、group by、distinct后面的字段建索引,能避免临时表和文件排序
- 索引并不是越多越好,非必要不创建索引
- 频繁查询的字段要建索引
- 创建索引尽量选择普通索引而不是唯一索引
- 联合索引,遵循最左前缀
- 避免类型长度大的字段做索引,text、longtext这种字段,索引占用空间大,加载到内存耗时,还可能把其他热点数据挤出Buffer Pool
二、索引的分类
一张图就搞定:
聚簇索引和非聚簇索引的区别?
1.聚簇索引叶子节点包含了实际的数据行,非聚簇索引的叶子节点任然是索引,存在一个指针指向对应的数据块,当通过聚簇索引查找数据时,可以直接从索引中获得数据,无需回表;
2.聚簇索引键值的逻辑顺序决定了相应行的物理存储顺序,非聚簇索引的逻辑顺序与磁盘上行的物理存储顺序不同;
3.每张表只能有一个聚簇索引,而可以有多个非聚簇索引
4.聚簇索引在范围查询和排序查询更有效率
B+树VSB 树VS二叉树VSHash
B+树 VS B 树:B+树只在叶子节点存储数据,而B树非叶子节点也要存储数据,所以在相同的IO磁盘次数下,就能查询更多的节点;B+树叶子节点采用的是双链表链接,更适合范围查询;
B+树 VS 二叉树:即使数据达到千万级别,B+树的高度维持在3-4层左右,相比于二叉树来讲树高更低,IO磁盘操作更少
B+树 VS Hash:Hash在做等值查询的时候效率较高,但是Hash不适合做范围查询
三、索引失效场景
- 模糊查询(like)的不当使用
- 在索引列中使用函数
- 联合索引不满足最左前缀原则
- 在索引列中进行表达式计算
- 在where子句中如果or前的条件列是索引列,而or后面的条件列不是索引列,也会导致索引失效
- 隐式类型转换,比如遇到字符串和数字比较时,会自动把字符串转为数字,然后进行比较,通过CAST函数完成隐式类型转换,等同于索引列使用了函数
四、索引使用技巧
索引下推(主要用在联合索引中)
把部分查询条件从server层下推到存储引擎层,在引擎层就把不符合条件的数据过滤掉,不需要回表查完整数据;
索引覆盖
SQL中查询的所有字段,在索引B+树的叶子节点上都能找到那些索引,从二级索引中查询得到记录,而不需要通过聚簇索引查询获得,可以避免回表操作
前缀索引
使用前缀索引是为了减小索引字段大小,可以增加一个索引页中存储的索引值,有效提高索引的查询速度。在一些大字符串的字段作为索引,使用前缀索引可以帮助我们减小索引页的大小;