在除了前面介绍的常见index merge的案例(Index Merge Union Access Algorithm)之外,还有一类很少见也比较特殊的index merge,多个索引扫描后进行交集,即 Index Merge Intersection。这类执行计划比较少见(因为MySQL需要ROR的原因),但是,在合适的场景使用,效率仍然会有很大的提示,本文将看看MySQL优化器如何评估和选择此类执行计划。MySQL手册对此只是三言两语简单介绍了一下,这里做个较为详细的说明。
这类执行计划完整名称应该是:The Index Merge Intersection Access Algorithm,下文简称Intersection。
1. 为什么需要考虑Intersection
考虑如下查询:
SELECT COUNT(*) FROM t1 WHERE key1=1 AND key2=1;
优化器可以考虑使用索引key1或者key2进行REF/Range访问,如果使用key1,那么key2=1则作为过滤条件。另外,优化器还会考虑使用Intersection,即同时使用索引key1和key2。这样做可能的好处是:
(a) 如果两次索引扫描后做交集,如果最后ROWID很少,则回表次数大大减少
(b) 如果扫描这两个索引能是覆盖扫描的话,则无需回表 (more…)