# 索引下推 (Index Condition Pushdown, ICP)

# 定义

索引下推是MySQL 5.6引入的一项优化技术,它允许数据库引擎在存储引擎层就过滤掉不符合条件的记录,而不是将所有满足索引部分条件的记录都返回给服务器层再进行过滤。

# 工作原理

  1. 在没有ICP时:存储引擎通过索引检索到数据后,将所有满足索引条件的记录返回给服务器层,服务器层再根据WHERE子句的其他条件进行过滤。
  2. 使用ICP时:存储引擎在读取索引的同时,就会检查WHERE子句中可以用到该索引的其他条件,直接在存储引擎层过滤掉不符合条件的记录。

# 适用场景

  1. 复合索引查询:当查询条件包含索引列和非索引列时
  2. 范围查询:当查询条件包含范围条件时
  3. 部分索引条件查询:当WHERE子句中有部分条件可以使用索引时
  4. InnoDB引擎的二级索引查询:特别适合这种场景

# 好处

  1. 减少IO操作:直接在存储引擎层过滤数据,减少了传输到服务器层的数据量
  2. 提高查询性能:避免了不必要的数据读取和传输
  3. 降低CPU消耗:减少了服务器层需要处理的数据量
  4. 优化复杂查询:对于包含多个条件的查询特别有效

# 示例

-- 假设有复合索引 (a, b)
SELECT * FROM table WHERE a = 1 AND b LIKE 'prefix%' AND c = 2;
1
2

没有ICP时:存储引擎找到所有a=1的记录,然后服务器层过滤b和c条件 有ICP时:存储引擎找到a=1的记录后,直接在存储引擎层过滤b LIKE 'prefix%'的条件

# 检查ICP使用

可以通过EXPLAIN查看Extra列中是否有"Using index condition"来判断是否使用了ICP。

ICP是MySQL优化查询性能的重要手段之一,特别适合复合索引和部分条件查询的场景。

上次更新: 8/12/2025, 2:55:52 AM