编辑
2026-01-22
MySQL
00
请注意,本文编写于 50 天前,最后修改于 50 天前,其中某些信息可能已经过时。

目录

覆盖索引
最左前缀原则
索引下推

05 | 深入浅出索引(下)

覆盖索引

sql
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 的值找到对应记录的 ID,然后再去聚簇索引树上找 ID 对应的行数据。
  • 但如果查询语句是 select ID from T where k between 3 and 5,索引 k 已经有 ID 信息,不需要做回表查询。此时由于索引 k 已经“覆盖了”我们的查询需求,我们称为覆盖索引
  • 使用覆盖索引可以提升查询性能

最左前缀原则

联合索引的例子图: image.png

B+ 树这种索引结构,可以利用索引的“最左前缀”,来定位记录。

  • 联合索引的最左 N 个字段
  • 字符串索引的最左 N 个字符

索引下推

如果有一条 sql 要求查询 “名字第一个字是张,而且年龄是 10 岁的所有男孩”

sql
select * from tuser where name like '张%' and age=10 and ismale = 1;
  • 在 MySQL 5.6 之前,只能从 ID3 开始一个个回表。到主键索引上找出数据行,再对比字段值。
  • 而 MySQL 5.6 引入的索引下推优化(index condition pushdown), 可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。

无索引下推的执行流程: image.png

有索引下推的执行流程: image.png

本文作者:菜宝熊

本文链接:

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