MySQL索引笔记

125 阅读1分钟

表T的结构如下:如果我执行 select * from T where k between 3 and 5,需要执行几次树的搜索操作,会扫描多少行?


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');

在 k 索引树上找到 k=3 的记录,取得 ID = 300;

再到 ID 索引树查到 ID=300 对应的 R3;

在 k 索引树取下一个值 k=5,取得 ID=500;

再回到 ID 索引树查到 ID=500 对应的 R4;

在 k 索引树取下一个值 k=6,不满足条件,循环结束。

这个语句共会执行三次索引查询和两次回表操作。

索引下推

在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。

mysql> select * from tuser where name like '张%' and age=10 and ismale=1;

无索引下推流程

有索引下推流程