

索引下推(Index Condition Pushdown, ICP)是数据库查询优化的一种技术。它主要用于提升数据库查询性能,尤其是顺序扫描大表或使用索引进行过滤时。索引下推在MySQL 5.6引入,是针对索引的查询优化。
索引下推的核心思想是把一部分查询条件“下推”到存储层的索引扫描过程,而无需每次都把数据从存储层读到服务层做判断。这样可以减少需要访问的数据行数,从而优化查询速度。
在没有索引下推时,当查询涉及多个筛选条件(WHERE 子句)时,数据库先通过索引查找到满足部分条件的记录,但并不会马上应用所有的条件过滤。
它会将索引匹配到的记录获取到服务层(Server Layer)后再检查剩余的条件是否符合,然后决定结果是否返回给用户。

这种做法在数据量大或涉及复杂条件时,可能会导致服务层不得不处理大量不必要的数据记录,从而性能不佳。
索引下推允许直接在存储引擎层应用更多的筛选条件,而不需要将所有的筛选工作都依赖上层来完成。存储层在扫描索引时,直接应用部分条件来过滤记录,减少向服务层返回的记录数量。
假如有一个表 products,带有索引 (category_id, price),查询语句如下:
SELECT * FROM products WHERE category_id = 10 AND price < 100;
(category_id, price) 找到所有 category_id = 10 的记录。price < 100 的记录是否符合条件。(category_id, price),不仅用于定位 category_id = 10 的记录,还直接在存储层检查 price < 100 条件。可以通过 EXPLAIN 命令检查查询计划,如果查询使用了索引下推,会看到关键字 Using index condition,例如:
EXPLAIN SELECT * FROM products WHERE category_id = 10 AND price < 100;
输出可能包括:
Extra: Using index condition
如果没有 "Using index condition",则说明没有启用索引下推。
总之,索引下推是数据库引擎的一项重要优化技术,它通过让存储层承担更多的筛选工作,显著提升了查询性能,特别是在使用复合索引的场景中。
全文完,感谢阅读,如果喜欢请三连。