什么是索引下推?
前言
今天来水一篇 MySQL 的问题。什么是索引下推?其实很多概念都是被中文名字唬住了,这个概念并不复杂。如果看得懂英文,建议直接跳转 Index Condition Pushdown Optimization
回表
这是一个前置知识点。当我们通过索引找到某条数据时,其实只是找到了它对应的 id,需要根据 id 回到原来的表里面把数据捞出来,这个过程就是回表。
索引下推
直接用官方的例子说明:有一个索引 INDEX (zipcode, lastname, firstname)
有一个查询如下:
1 | SELECT * FROM people |
本来是不能命中全部索引的,因为后面两个条件是左 % LIKE,当然最左匹配原则可以先利用 zipcode 定位到数据。下面就是关键了:
如果,没有索引下推,那么当找到这条数据时,需要回表找到原数据来判断是否满足条件。
如果,使用索引下推,那么此时可以直接推理判断是否当然索引数据满足条件。
即:索引下推其实就是为了减少回表次数的一种优化。
MySQL can use the index to scan through people with
zipcode='95054'
. The second part (lastname LIKE '%etrunia%'
) cannot be used to limit the number of rows that must be scanned, so without Index Condition Pushdown, this query must retrieve full table rows for all people who havezipcode='95054'
.
With Index Condition Pushdown, MySQL checks the
lastname LIKE '%etrunia%'
part before reading the full table row. This avoids reading full rows corresponding to index tuples that match thezipcode
condition but not thelastname
condition.
条件
官方也说了一些不能触发索引下推的条件,其实都很符合直觉:
- subqueries
- stored functions
- Triggered conditions
其实关键还是满足 range, ref, eq_ref, and ref_or_null 这几个条件
总结
不理解概念其实没关系,总结其实我还是那句话,写 SQL 的 where 条件的时候,将确定的条件按字段顺序放前面,将不确定的条件放后面,这样会给以后的优化留下很大的余地,剩下的问题就交给索引、MySQL 和 DBA 吧。