本文主要是介绍【MySQL】索引下推,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
索引下推(ICP)是一种在存储引擎层使用过滤数据的优化方式。使用ICP的好处在于其可以减少存储引擎必须访问基表的次数和MySQL服务器必须访问存储引擎的次数。但ICP的加速效果取决于存储引擎内通过ICP筛掉的数据比例。
举个例子
CREATE INDEX zip_last_first ON people(zipcode, lastname, firstname);EXPLAIN SELECT * FROM people
WHERE zipcode = 1
AND lastname LIKE '%张';
AND address LIKE '%北京%';
在没有开启索引下推的情况下,MySQL首先会根据语句zipcode=1
在B+树中进行查找,在找到相应叶结点后回表,并从磁盘中调取符合条件的数据记录进入内存,然后再以剩下的条件进行过滤。
在开启了索引下推的情况下,此时由于lastname
的条件导致该语句索引失效,但是索引中仍然包含该字段。此时优化器会对zipcode
和lastname
两个字段先进行筛选(address并不是索引中的字段,所以不判断它),筛选完后得到的数据量较小,此时再回表的效率较高。
但是对于索引字段都能生效的情况来说,索引下推的意义不大,此时已经是对三个字段进行筛选后再回表加载数据。
ICP的使用条件
- 如果表访问类型为range、ref、eq_ref和ref_or_null可以使用ICP
- ICP可以用于InnoDB和MyISAM表
- 对于InnoDB表,ICP仅作用于二级索引,这是由于ICP的目标是减少全行读取次数从而减少IO
- 当SQL使用覆盖索引时,不支持使用ICP,此时ICP不会减少IO
- 相关子查询的条件不能使用ICP
**总的来说,ICP主要是减少回表时数据量的大小。如果没有回表操作,则使用ICP没有意义
这篇关于【MySQL】索引下推的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!