当索引下推开启后,如果where
子句中的部分条件可以通过索引中的列来进行过滤,MySQL会把这部分条件也下推给存储引擎。这里的关键是下推的这部分条件用于过滤而非定位数据。
直接看官方的例子:
SELECT * FROM people
WHERE zipcode='95054'
AND lastname LIKE '%etrunia%'
AND address LIKE '%Main Street%';
假设people表上存在索引INDEX (zipcode, lastname, firstname)
,由于第二个条件lastname LIKE '%etrunia%'
前后都有%
所以不能使用索引。如果没有索引下推,那么MySQL只能让存储引擎完整的读取所有符合zipcode='95054'
的行然后交给MySQL服务器进行筛选。有了索引下推,由于lastname
也在索引中,所以MySQL可以把两个查询条件都传给存储引擎,存储引擎读取到所有符合zipcode条件的索引元组后通过索引中的数据先过滤一次,符合条件的再读取完整的行。如下图: