MySQL -- 回表 | 索引覆盖 | 索引下推 | 最左前缀原则 介绍
Posted 做猪呢,最重要的是开森啦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL -- 回表 | 索引覆盖 | 索引下推 | 最左前缀原则 介绍相关的知识,希望对你有一定的参考价值。
具体原理需要对索引数据结构有所了解,不懂的可以先参考索引数据结构介绍
1. 回表:
在查询数据过程,根据辅助索引的叶子节点存储的主键,去主键索引的B+树上再进行数据检索的过程,称之为回表
`
使用上尽量避免回表查询
2. 索引覆盖:
索引的B+树上包含了所要查询的所有字段,此时不需要再回表查询,这个过程称之为索引覆盖,推荐使用索引覆盖
- 比如table表有a,b,c,d,e个字段,其中a是主键,另外有一联合索引idx_bcd (b,c,d)
- 查询select * from table where b=3 and c =4; 该语句语句会走索引,但还需要再去主键索引获取所有字段数据
- 查询select a,b,d from table where b=3 and c =4; 该语句也走索引,但不会去回表查询,因为该索引树已经包括a,b,d字段数据
在 Explain执行计划 结果的Extra列,会显示Using index
3. 索引下推:
- 比如table表有a,b,c,d,e个字段,其中a是主键,另外有一联合索引idx_bcd (b,c,d),然后查询select * from table where b=3 and d =5;
- 没有索引下推之前,存储引擎根据b=3检索到数据返回给mysql的server层,在server层再通过d=5进行过滤,比较费时费性能
- MySQL 5.6 之后,便支持索引下推,存储引擎通过b=3,d=5直接检索符合条件的数据,不需要再在server层过滤
- 所谓下推,就是将条件过滤下推到server层的“下级”存储引擎来进行
在 Explain执行计划 结果的Extra列,会显示Using index condition
4. 最左前缀原则:
联合索引中,如果最左边的索引字段没有生效,那么其他索引字段作条件,索引也不会生效
- 比如table表有a,b,c,d,e个字段,其中a是主键,另外有一联合索引idx_bcd (b,c,d),其实等效于创建了(b),(b,c),(b,c,d)三个索引
【举些栗子】:
- select * from table where b=3 and c=4 and d=5; – 会走索引,索引用到b、c、d字段
- select * from table where b=3 and d=5; – 会走索引,索引用到b
- select * from table where c=4 and b=3; – 会走索引,索引用到b、c字段
- select * from table where c=4 and d=5; – ==不会走索引,违法最左匹配原则
【原理】:
索引是排好序的数据结构,不懂联合索引数据结构的可以参考:联合索引数据结构
- 根据b=3,我们能从非叶子节点中获取到叶子节点的磁盘地址,就能利用索引快速查询到数据
- 如果没有b=3,根据c=4,无法定位到叶子节点的地址,甚至无法定位到第二层非叶子节点的地址
- 因为每个非叶子节点c也是排好序的,每一块非叶子节点都有可能存在 c=4,这样就无法定位到叶子节点,所以就走了全表查询
【再举个栗子】:
这也是为什么模糊查询的时候为什么不推荐左模糊("%aa")和全模糊("%aaa%")
·
因为这不满足最左前缀原则,会导致索引失效
以上是关于MySQL -- 回表 | 索引覆盖 | 索引下推 | 最左前缀原则 介绍的主要内容,如果未能解决你的问题,请参考以下文章