笔记 | 深入浅出索引(下)

2022-10-26 15:56:17 浏览数 (1)

覆盖索引

【举栗】

代码语言:javascript复制
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;
代码语言:javascript复制
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,不满足条件,循环结束。

在这个过程中,回到主键索引树搜索的过程,我们称为回表

执行 select ID from T where k between 3 and 5
  • 这时只需要查 ID 的值,而 ID 的值已经在 k 索引树上了,因此可以直接提供查询结果,不需要回表。也就是说,在这个查询里面,索引 k 已经“覆盖了”我们的查询需求,我们称为覆盖索引

二级索引查询结果仅仅是主键 此时不需要回表查主键索引 称为覆盖索引 由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。

最左前缀原则

(name,age)索引示意图

索引项是按照索引定义里面出现的字段顺序排序的 联合索引(A, B)意味着不需要建立A的索引了,因为这个联合索引意味着建立了(A,B)和(A)这两种索引 如果单使用age作为条件,索引是不会生效的,除非单独建立一个age索引,因为它遵循最左原则

索引下推

代码语言:javascript复制
mysql> select * from tuser where name like '张%' and age=10 and ismale=1;

MySQL 5.6 引入的索引下推优化(index condition pushdown), 可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。

无索引下推执行流程

索引下推执行流程

0 人点赞