MySQL 的索引下推是什么?
MySQL 的索引下推是什么?
回答重点
索引下推(Index Condition Pushdown, ICP)是一种减少回表查询,提高查询效率的技术。它允许 MySQL 在使用索引查找数据时,将部分查询条件下推到存储引擎层过滤,从而减少需要从表中读取的数据行,减少了 IO(本该由 Server 层做操作,交由存储引擎层因此叫做 “下推” ) 。
注意:索引下推是应用在联合索引上的。
扩展知识
官网示例说明
假设当前 people 表有索引 INDEX (zipcode, lastname, firstname) ,当执行以下查询时:
1 | SELECT * FROM people |
如果没有索引下推,当前的联合索引只能用上 zipcode='95054' 这个条件,引擎层用不上 lastname 这个条件过滤,只能得到所有符合 zipcode='95054' 记录,传递给 server 层过滤。
有了索引下推之后,引擎层在得到符合zipcode='95054'的数据后,可以直接通过 lastname 条件过滤数据,不符合条件的不会返回给 server 层。
索引下推注意点
1)索引下推在 MySQL 5.6 及以后的版本支持,InnoDB 和 MyISAM 这两个存储引擎都生效。
2)如果查询中引用了子查询索引下推可能不会生效,具体看 explain。
3)使用了函数或表达式索引下推也不能生效,这个和是否能命中索引的条件是一样的。
4)使用了聚簇索引(主键)查询,索引下推也不会生效,因为其是对于非聚簇索引来进行减少回表次数。
Comments