05 | 深入浅出索引(下)
sqlmysql> 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 的值找到对应记录的 ID,然后再去聚簇索引树上找 ID 对应的行数据。select ID from T where k between 3 and 5,索引 k 已经有 ID 信息,不需要做回表查询。此时由于索引 k 已经“覆盖了”我们的查询需求,我们称为覆盖索引联合索引的例子图:

B+ 树这种索引结构,可以利用索引的“最左前缀”,来定位记录。
如果有一条 sql 要求查询 “名字第一个字是张,而且年龄是 10 岁的所有男孩”
sqlselect * from tuser
where
name like '张%'
and age=10 and ismale = 1;
无索引下推的执行流程:

有索引下推的执行流程:

本文作者:菜宝熊
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!