MySQL的索引下推(Index Condition Pushdown, ICP)是一种查询优化技术,它允许MySQL在存储引擎层执行部分WHERE子句中的过滤条件,而非全部在MySQL服务器层执行。这使得在扫描索引过程中就可以剔除不满足条件的记录,从而减少不必要的数据读取和回表操作,提高查询性能。
索引下推例子:
假设有一个销售订单表orders
,其上有如下结构及索引:
CREATE TABLE `orders` (`order_id` INT PRIMARY KEY,`customer_id` INT,`product_id` INT,`order_date` DATE,INDEX idx_customer_product (`customer_id`, `product_id`)
);
现在有一个查询:
SELECT * FROM orders
WHERE customer_id = 123 AND product_id = 456 AND order_date > '2020-01-01';
在没有启用索引下推的情况下,MySQL可能会首先使用复合索引idx_customer_product
找到所有customer_id = 123
和product_id = 456
的记录,然后对于索引扫描的结果,逐行回表查询对应的完整行数据,再在MySQL服务器层检查order_date > '2020-01-01'
这个条件。
然而,启用索引下推后,MySQL会将order_date > '2020-01-01'
这个条件下推到存储引擎层,在扫描idx_customer_product
索引时,不仅能匹配customer_id
和product_id
,同时也会在索引内直接判断order_date
是否大于’2020-01-01’,只有当索引中的这三个条件都满足时,才会真正回表读取完整的行数据。
这种优化意味着MySQL能够在访问实际数据页之前,提前在索引内部完成更多条件的过滤,极大地提升了查询效率。
MySQL的索引下推(Index Condition Pushdown,简称ICP)是一项优化查询性能的技术,它是MySQL从5.6版本开始引入的一项重要特性。在传统的查询执行流程中,MySQL服务器层可能需要先根据索引检索到相关的记录主键,然后再到存储引擎层根据这些主键值获取完整的行数据,最后在服务器层对行数据应用WHERE子句中的其他过滤条件。
索引下推优化了这个过程,它允许MySQL服务器在生成执行计划时,将那些可以在索引中直接计算或过滤的WHERE条件下推到存储引擎层进行执行。这意味着存储引擎在遍历索引的过程中,不仅可以利用索引快速定位记录,而且可以在读取索引的同时就完成一部分WHERE条件的判断,只取出那些真正满足所有条件的行数据,而不是先返回所有引用主键的记录,再由服务器层进一步筛选。
例如,在一个带有多个列的索引中,即使查询条件包含了索引列和非索引列,ICP也能发挥作用,存储引擎可以直接在索引内部进行多列条件的初步筛选,减少不必要的回表操作(即减少访问实际数据页的次数),从而降低IO成本,提高查询性能。
总结来说,MySQL索引下推的作用在于:
1. 减少存储引擎访问基表的次数。
2. 减少MySQL服务器层与存储引擎层之间的数据传输量。
3. 提高了SQL查询的执行效率,特别是在涉及大量数据过滤时效果尤为显著。