mysql覆盖索引&回表查询
需要的前置知识: 什么是聚簇索引、非聚簇索引、回表查询-CSDN博客
什么是覆盖索引
就是查询的字段是索引里的。打个比方,有个user表,字段为id、name、gender,id是主键,有聚簇索引,name是非聚簇索引。
现在执行两条语句:
select id,name from user where name = 'kit';
select * from user where name = 'kit';
第一条语句符合覆盖索引,因为查询的字段id和name是是name索引表就能查到的,不用回表查询,这里不懂没关系,后面我详细带你走一遍查询流程就明白了。
第二条不符合覆盖索引,因为查询的是*,所有字段,走name索引查不到gender,就得回表查询聚簇索引。
覆盖索引 VS 非覆盖索引
覆盖索引
如下图是name字段的二级索引,可以看见叶子节点是存储了name和id字段信息,现在执行上述提到的覆盖索引语句。
select id,name from user where name = 'kit';
现在根据name = ‘kit’条件走二级索引,一次就能查到id和name,这叫做覆盖索引。
非覆盖索引
如下图是id字段的聚簇索引,可以看见叶子节点是存储了name、id、gender一整行的字段信息,现在执行上述提到的非覆盖索引语句。
select * from user where name = 'kit';
现在根据name = ‘kit’条件走上图二级索引,一次能查到id和name,但是查不到gender,此时就得拿着id去下图聚集索引表查询,这就叫做回表查询,回表查询效率肯定不及查一次,所以我们写sql的时候尽量让查询字段覆盖索引。
原文地址:https://blog.csdn.net/weixin_52136521/article/details/144067554
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!