Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL查询优化

MySQL查询优化的三种处理阶段(Index Key、Index Filter和Table Filter)详解

作者:师兄奇谈

在 MySQL 中,索引主要用于优化查询,在 MySQL 查询优化中涉及到三种处理阶段,Index Key、Index Filter 和 Table Filter,下面小编就为大家详细介绍一下这三个阶段吧

在 MySQL 中,索引主要用于优化查询。在 MySQL 查询优化中涉及到三种处理阶段:Index KeyIndex Filter 和 Table Filter

它们描述的是数据库在使用索引时,查询条件的匹配和过滤发生的过程,这个分类的背景通常出现在讨论索引下推(Index Condition Pushdown, ICP)时。

以下是对这三种索引处理阶段的详细说明:

1. Index Key

定义:索引键 (Index Key) 是指索引的关键列,即索引中存储的字段值。索引键是用来帮助定位数据行的,查询通常首先使用索引键来筛选匹配最基础条件的记录。

使用场景

当查询条件和索引的定义一致时,例如:

SELECT * FROM employees WHERE employee_id = 123;

如果 employee_id 有索引,数据库可以通过索引键快速找到符合条件的记录。

特性

查询执行流程

通过索引键快速定位对应的记录集合。

2. Index Filter

定义:索引过滤 (Index Filter) 是对索引存储的数据进行进一步过滤,用于实现更复杂的查询条件,而无需先通过索引定位所有数据然后回表。索引过滤是在存储引擎层完成的,是索引下推优化的关键部分

使用场景

查询条件涉及多个字段,但不是全部字段都能通过索引键直接定位。例如:

SELECT * FROM employees WHERE employee_id > 100 AND salary < 50000;

假设有索引 (employee_id, salary)

特性

查询执行流程

3. Table Filter

定义:表过滤 (Table Filter) 是指数据库通过回表查询数据后,再对返回的表中数据进行过滤。这通常是针对查询条件中涉及的非索引列,或者索引本身无法过滤的情况。

使用场景

查询条件涉及非索引字段,例如:

SELECT * FROM employees WHERE employee_id > 100 AND department = 'Engineering';

假设只有索引 (employee_id)

特性

查询执行流程

三类过滤物理过程

Index Key 初始阶段,通过索引键快速定位候选记录。

Index Filter 在存储引擎层上对候选记录进行进一步过滤,减少需要回表的记录数。

Table Filter 如果查询涉及非索引列或更复杂的过滤条件,需要回表查询,并在服务器层最终过滤。

索引下推重要点

MySQL 5.6 之前,一旦记录在索引 Key 查找到,所有复杂条件的过滤都在 Server 层完成(包括非下推的 Index Filter 和 Table Filter)。

MySQL 5.6 开始支持索引下推 (ICP),将部分过滤逻辑 (Index Filter) 下推到存储引擎层,并在回表查询之前完成过滤,显著减少了回表次数和 Server 层的压力。

示例

假设有一个包含索引 (employee_id, salary) 的表,查询如下:

SELECT * FROM employees WHERE employee_id > 100 AND salary < 50000 AND department = 'Engineering';

索引下推

索引下推(Index Condition Pushdown, ICP)是数据库查询优化的一种技术。它主要用于提升数据库查询性能,尤其是顺序扫描大表或使用索引进行过滤时。索引下推在 MySQL 5.6 引入,是针对索引的查询优化。

简单解释

索引下推的核心思想是把一部分查询条件“下推”到存储层的索引扫描过程,而无需每次都把数据从存储层读到服务层做判断。这样可以减少需要访问的数据行数,从而优化查询速度。

传统索引扫描

在没有索引下推时,当查询涉及多个筛选条件(WHERE 子句)时,数据库先通过索引查找到满足部分条件的记录,但并不会马上应用所有的条件过滤。它会将索引匹配到的记录获取到服务层(Server Layer)后再检查剩余的条件是否符合,然后决定结果是否返回给用户。

这种做法在数据量大或涉及复杂条件时,可能会导致服务层不得不处理大量不必要的数据记录,从而性能不佳。

有索引下推的查询流程

索引下推允许直接在存储引擎层应用更多的筛选条件,而不需要将所有的筛选工作都依赖上层来完成。存储层在扫描索引时,直接应用部分条件来过滤记录,减少向服务层返回的记录数量。

举例说明:

假如有一个表 products,带有索引 (category_id, price),查询语句如下:

SELECT * FROM products WHERE category_id = 10 AND price < 100;

没有索引下推:

有索引下推:

优势

使用注意

如何验证索引下推

你可以通过 EXPLAIN 命令检查查询计划,如果查询使用了索引下推,会看到关键字 Using index condition,例如:

EXPLAIN SELECT * FROM products WHERE category_id = 10 AND price < 100;

输出可能包括:

Extra: Using index condition

如果没有 "Using index condition",则说明没有启用索引下推。

总之,索引下推是数据库引擎的一项重要优化技术,它通过让存储层承担更多的筛选工作,显著提升了查询性能,特别是在使用复合索引的场景中。

小结

索引下推利用了 Index Filter 在存储层完成过滤的能力,减少了回表次数和 Server 层处理数据的压力,从而优化了查询性能。在实际使用索引时,通过合理的覆盖索引设计,可进一步减少回表,提高效率。

到此这篇关于MySQL查询优化的三种处理阶段(Index Key、Index Filter和Table Filter)详解的文章就介绍到这了,更多相关MySQL查询优化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文