目录
1. 索引下推概述
2. 索引下推举例
3. ICP 的主要作用
1. 索引下推概述
ICP 全称 Index Condition Pushdown,是MySQL5.6之后的一个新特性,它是一种在存储引擎层使用索引过滤数据的一种优化方式。
2. 索引下推举例
下面是数据库的一张 employees 员工表,表中有诸多字段
然后我给 department_id 部门id和 salary 薪水字段添加一个联合索引,departmend_id 排第一位,salary 排第二位
然后利用这个联合索引做一次条件查询。
(1)查询语句如下,
EXPLAIN
SELECT *
FROM employees
WHERE department_id > 50 AND salary > 8000;
可以看到,查询条件中使用到了 department_id 和 salary,所以优化器会选择使用联合索引查询;
(2)首先第一个过滤条件 department_id > 50,可以通过索引快速查询,但是使用到了 ">" ,会导致联合索引后面的索引字段失效,即 salary 再进行判断的时候会进行全表扫描,不能走索引,联合索引只有 department_id 生效;
(3)假如说数据库查询到了 department_id 的数据一共有十条,那么正常来讲这十条数据会全部进行回表查询,查询到十条数据之后再判断第二个过滤条件 salary;
(4)但是数据库优化器会进一步采取索引下推,在这十条数据回表之前,先在引擎层对这十条数据后一个过滤条件 salary > 8000 做判断,这样一来就有可能会再次过滤一些不满足条件的记录,我们假设过滤之后剩下五条记录,那么就只需要进行5次回表查询,将回表查询次数减少,提高了数据库查询效率
使用 explain 执行计划输出查询详细信息
得出如下结果,可以发现再 Extra 额外信息行显示 Using index condition,Using where
Using index condition 就表示用到了索引下推,索引下推通常应用于联合索引中;
3. ICP 的主要作用
对于InnoDB存储引擎来说,索引下推主要是减少回表查询的次数,降低数据库的IO消耗;因为回表查询是一种随机IO的行为,在回表之前减少回表次数就可以降低数据库的随机IO资源消耗;
ICP不仅可以应用于InnoDB存储引擎,也可以应用于MyISAM存储引擎;