15 什么叫索引下推,回表?

vvEcho 2025-02-28 15:48:05
Categories: Tags:

索引下推

索引下推简称ICP(index condition push),是mysql5.6后新增的功能,主要的核心点在于把数据筛选的过程放在了存储引擎层面,减少了返回的数据量和回表的次数,从而提高查询效率。

举例说明:

1
2
3
4
5
6
7
8
9
10
11
12
以联合索引(name,age)为例,假设查询条件为name LIKE '张%' AND age=10:

未开启索引下推(MySQL 5.6 之前)
存储引擎通过索引找到 name LIKE '张%' 的所有记录(如 id=1,4)。
逐条回表查询完整数据。
服务层过滤 age=10 的记录。
问题:需多次回表,即使 age 不满足条件也会回表

开启索引下推(MySQL 5.6 之后)
存储引擎遍历索引时,直接检查 age=10 的条件,过滤掉不符合的记录。
仅对符合条件的记录(如 id=1)回表查询。
优势:减少回表次数和无效数据传输

回表

数据库查询使用普通字段时,因为索引中只存了索引键值和主键值,无法通过索引键值查询到数据,所以需要回表,也就是通过主键值查询到数据。

如何避免回表?

创建包含所有查询字段的索引,例如索引包含(name, department)时,查询SELECT department FROM employees WHERE name='Alice'可直接从索引获取数据,无需回表
需注意索引长度限制,避免触发回表

使用聚簇索引(如主键索引)的叶子节点存储完整数据行,直接通过主键查询时无需回表。例如,SELECT * FROM employees WHERE id=1可直接获取所有字段