一、索引下推
索引下推(index condition pushdown)简称ICP,是mysql5.6版本的新特性,它能减少回表的查询次数,提高查询效率,索引下推其实就是将部分上层(服务层)负责的事情,交给了下层(引擎层)去处理。
未使用索引下推,mysql查询过程
存储引擎读取索引记录(不是完整的行记录)
根据索引中的主键值,定位并读取完整的行记录
存储引擎把记录交给server层去检测该记录是否满足where条件
使用索引下推,mysql查询过程
存储引擎读取索引记录(不是完整的行记录)
判断条件部分能否用索引中的列来做检查
条件不满足,则处理下一行索引记录
条件满足,使用索引中的主键去定位病毒去完整的行记录(就是所谓的回表)
存储引擎把记录交给服务层。
二、索引下推案例
用户表user,联合索引为(name, age)
| id | name | age |
|---|---|---|
| 1 | 张三 | 10 |
| 2 | 李四 | 12 |
| 3 | 王五 | 12 |
| 4 | 张猛 | 16 |
语句
select * from user where name like '张%' and age = 10
根据最左匹配原则,只能用到索引 ‘张’
未使用索引下推
先根据二级索引得到张三和张猛的两条记录
根据id回表查询(id=1 id = 4)
讲记录返回server层,判断age条件
使用索引下推
先根据二级索引得到张三和张猛的两条记录
由于是name跟age的联合索引,所以可直接根据age条件判断,得到id=1的记录
回表查询id=1的记录返回server层
