

在 MySQL 中,索引主要用于优化查询。在 MySQL 查询优化中涉及到三种处理阶段:Index Key、Index Filter 和 Table Filter。
它们描述的是数据库在使用索引时,查询条件的匹配和过滤发生的过程,这个分类的背景通常出现在讨论索引下推(Index Condition Pushdown, ICP)时。
关于索引下推可参考我们前面写的这篇文章:《什么是MySQL的索引下推技术?》
以下是对这三种索引处理阶段的详细说明:
定义:索引键 (Index Key) 是指索引的关键列,即索引中存储的字段值。索引键是用来帮助定位数据行的,查询通常首先使用索引键来筛选匹配最基础条件的记录。
使用场景:
SELECT * FROM employees WHERE employee_id = 123;
如果 employee_id 有索引,数据库可以通过索引键快速找到符合条件的记录。
特性:
查询执行流程:
定义:索引过滤 (Index Filter) 是对索引存储的数据进行进一步过滤,用于实现更复杂的查询条件,而无需先通过索引定位所有数据然后回表。索引过滤是在存储引擎层完成的,是索引下推优化的关键部分。
使用场景:
SELECT * FROM employees WHERE employee_id > 100 AND salary < 50000;
假设有索引 (employee_id, salary):
employee_id > 100 定位部分范围的记录;salary < 50000 进一步过滤索引中的记录,而不是直接将所有匹配 employee_id > 100 的记录返回到 Server 层。特性:
查询执行流程:
定义:表过滤 (Table Filter) 是指数据库通过回表查询数据后,再对返回的表中数据进行过滤。这通常是针对查询条件中涉及的非索引列,或者索引本身无法过滤的情况。
使用场景:
SELECT * FROM employees WHERE employee_id > 100 AND department = 'Engineering';
假设只有索引 (employee_id):
employee_id > 100;department 列,并在 Server 层过滤 department = 'Engineering' 的条件。特性:
查询执行流程:
假设有一个包含索引 (employee_id, salary) 的表,查询如下:
SELECT * FROM employees WHERE employee_id > 100 AND salary < 50000 AND department = 'Engineering';
employee_id > 100 进行范围扫描,获取候选记录。salary < 50000 过滤出满足条件的记录,减少回表的次数。department = 'Engineering' 的条件进行过滤,最终返回结果。索引下推利用了 Index Filter 在存储层完成过滤的能力,减少了回表次数和 Server 层处理数据的压力,从而优化了查询性能。在实际使用索引时,通过合理的覆盖索引设计,可进一步减少回表,提高效率。
全文完,感谢阅读,如果喜欢请三连。