覆盖索引

 

什么是 '查询需要返回的字段' : 简单理解就是select后面跟的那个词

 

覆盖索引指的是一条select查询语句在查询的过程中,使用到了索引,并且查询需要返回的字段,在该索引中已经全部找到了对应的字段值,这类的操作 就称为覆盖查询。前面学的是where之后的条件怎么去规避索引失效。这节课我们学的是查询需要返回的字段怎么去规避索引失效。 在实际业务开发中,尽量使用覆盖索引,较少select *

 

例如下面的4个演示,注意我们主要关注的是select之后的词,from后面的我们不需要过多纠结

 

通过上面的四条演示,可发现前2条的执行计划返回的结果,中的最后一列Extra,前3条语句都是为Using where、Using index 后2条语句的执行计划的Extra列为Using index condition

 

知识小贴士:

1、using index condition: 查找使用了索引,但是需要回表查询数据。也就是出现这个,就说明这条语句回表查询了,回表查询的后果就是查询效率低

2、using where: 查找使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据

3、using index: 查找使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据

4、null: 查询使用了索引,并且回表查询

5、联合索引本质是二级索引,只不过单列存的是一个值加主键,多列是多个值加主键

 

主键索引称为聚集索引,也就是id也叫聚集索引。聚集索引的B+树的底部叶子节点的数据是某个id值的一整行数据 除主键索引,其他的索引就是二级索引(或叫辅助索引),二级索引的B+树的底部叶子节点的数据是该索引对应的id值

 

为什么上面查询这id, profession, age ,status四个字段不用回表呢。原因: 是我们在前面几节课把profession, age ,status字段设置了联合索引,联合索引 是属于二级索引(或叫辅助索引),二级索引的B+树的底部叶子节点上的值是id,所以我们在二级索引这里就找到了id, profession, age ,status这四个字段, 把要找的都找完了,就没必要再拿着id主键到一级索引里面查(这步就叫回表查询),也就没有经历回表查询。如果还要求再查一个name字段,由于name字 段不是主键索引,也不是联合索引中的一个,所以要把name字段的值查出来,就必须得经历回表查询

 

如果没有经历回表查询,也就是只在二级索引的B+树就找到了要找的所有数据,所用到的索引就称为覆盖索引

 

什么是回表查询 先走二级索引去查,把查询到的结果,拿去聚集索引中查

 

总结如下:

1、不回表

 

2、回表