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 -- 回表 | 索引覆盖 | 索引下推 | 最左前缀原则 介绍的主要内容,如果未能解决你的问题,请参考以下文章

MySQL -- 回表 | 索引覆盖 | 索引下推 | 最左前缀原则 介绍

mysql索引 回表 覆盖索引 索引下推

mysql 回表索引覆盖最左匹配索引下推

索引知识系列二:联合索引索引覆盖和索引下推详解

Mysql:好好的索引,为什么要下推?

MySql索引下推知识分享