首页 > 数据库 > MySQL > 还傻傻分不清MySQL回表查询与索引覆盖?
最近的工作中,遇到一个查询里用到主键索引与二级索引并存的问题情况,那对于这种情况,索引是如何高效执行的,是否会产生回表查询呢?

mysql> create table user( -> id int(10) auto_increment, -> name varchar(30), -> sex tinyint(4), -> type varchar(8), -> primary key (id), -> index idx_name (name) -> )engine=innodb charset=utf8mb4;
id 字段是聚簇索引,name 字段是普通索引(二级索引)
mysql> select * from user;+----+--------+------+------+| id | name | sex | type |+----+--------+------+------+| 1 | sj | m | A || 3 | zs | m | A || 5 | ls | m | A || 9 | ww | f | B |+----+-----+-----+-----+
id 是主键,所以是聚簇索引,其叶子节点存储的是对应行记录的数据

name 是普通索引(二级索引),非聚簇索引,其叶子节点存储的是聚簇索引的的值

如果查询条件为主键(聚簇索引),则只需扫描一次B+树即可通过聚簇索引定位到要查找的行记录数据。
select * from user where name = 'lisi';
普通索引因为无法直接定位行记录,其查询过程在通常情况下是需要扫描两遍索引树的。

explain select id, name from user where name = 'lisi';
explain分析:因为name是普通索引,使用到了name索引,通过一次扫描B+树即可查询到相应的结果,这样就实现了覆盖索引

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70024420/viewspace-2935962/ ,如需转载,请注明出处,否则将追究法律责任。