mysql索引覆盖与回表
新建一张表:
CREATE TABLE `r` (
`id` int NOT NULL primary key auto_increment,
`k` int not null, `name` varchar(16),
index(k)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
在表中插入(1,10,"张三"),(2,20,"李四"),(3,30,"王五")。则索引如下图

其中有两类索引,聚簇索引和辅助索引。其他聚簇索引包含整行数据的信息,辅助索引只包含主键的值。
聚簇索引的生成规则:1.主键;2.没有主键,就是第一个唯一非空索引;3.都没有,会生成隐藏列做为聚簇索引。
基于主键索引和普通索引查询有什么区别?
比如:1.select * from r where id = 1;使用id主键索引来查询,只需要搜索聚簇索引这个B+树。
2. select * from r where k = 10;使用k这个索引来进行查询,1.首先会通过辅助索引 k 查询到对应主键id=1;2.在通过id,搜索聚簇索引来查询出其他字段的值。这个过程就叫 回表。
索引覆盖
select id from where k = 10;因为id就在k这个辅助索引里面可以查到,不需要再去id的B+树里去进行查询。这个就叫索引覆盖。
由于覆盖索引可以减少数的搜索次数,显著提高查询性能,所以使用覆盖索引是一个常用的优化手段。