mysql> create table T (
ID int primary key,
k int NOT NULL DEFAULT 0,
s varchar(16) NOT NULL DEFAULT '',
index k(k))
engine=InnoDB;
insert into T values(100,1, 'aa'),(200,2,'bb'),(300,3,'cc'),(500,5,'ee'),(600,6,'ff'),(700,7,'gg');
select * from T where k between 3 and 5
执行流程:
在 k 索引树上找到 k=3 的记录,获得 ID = 300;
再到 ID 索引树查到 ID=300 对应的 R3;
在 k 索引树取下一个值 k=5,获得 ID=500;
再回到 ID 索引树查到 ID=500 对应的 R4;
在 k 索引树取下一个值 k=6,不满足条件,循环完结。
在这个过程中,回到主键索引树搜寻的过程,咱们称为回表。能够看到,这个查问过程读了 k 索引树的 3 条记录(步骤 1、3 和 5),回表了两次(步骤 2 和 4)。
笼罩索引:
如果执行的语句是 select ID from T where k between 3 and 5,这时只须要查 ID 的值,而 ID 的值曾经在 k 索引树上了,因而能够间接提供查问后果,不须要回表。也就是说,在这个查问外面,索引 k 曾经“笼罩了”咱们的查问需要,咱们称为笼罩索引。
索引下推
MySQL 5.6 引入的索引下推优化(index condition pushdown),能够在索引遍历过程中,对索引中蕴含的字段先做判断,间接过滤掉不满足条件的记录,缩小回表次数。