总结了下,其中有一些并没查到文档描述,所以有猜测成分,如有错误请指出。
索引合并主要分 3 类
索引交集合并
限制条件: where 必须是 or 连接的多个条件,并且每个条件是等值匹配匹配的二级索引或者范围匹配的主键索引。
动机:当优化器发现使用多个索引取交集减少的回表成本超过使用多个索引读取新增的成本时,会使用索引交集合并优化。(之所以限制中二级索引是等值匹配,是因为范围匹配极大概率减少的成本不如新增的成本?直接一刀切?作为对比,索引并集合并则支持 range 匹配)
索引并集合并(支持 range 匹配二级索引的叫做索引并集排序合并,感觉没必要区分这 2 类)
限制条件: where 必须是 and 连接的多个条件,并且每个条件是范围匹配的二级索引或者主键索引或者可以用索引交集合并优化的条件。
动机: 如果不使用多个索引取并集,则只能去全表扫描。但是使用多个索引取并会新增一个排序成本,就是多个索引取出来的记录可能存在重复,需要按照 ID 排序去重(这里文档只说了排序,没有说原因,原因个人猜测是为了去重?对吗?)。所以优化器还会考虑使用多个索引查询出来的记录多不多,如果太多排序的代价超过全表扫描代价,就仍然会选择全表扫描?