1.什么是索引合并
当where条件包含多个索引时,mysql可能会使用超过一个索引提高查询效率(当然也可能不走索引,以explain为准),例如有idx_a, idx_b,查询语句where a = 1 and b = 'a',可能会走索引合并
2.特征
explain type=index_merger
3.有哪些类型
有以下三种类型,可在explain 的extra中查看
intersect(交集): 例如where a = 1 and b = 'a',简单理解就是分别按照idx_a和idx_b查出两个集合,求交集;但要求查出的两个集合是主键有序的,为了便于求交集,当然mysql可以自己先排序再求交集(猜测可能因为效率不愿意这样做);
union(并集) :例如where a = 1 or b = 'a',同上(这里也是要求两个集合主键有序);
sort_union(排序并集) :例如where a > 1 or b = 'a',也是分别求两个集合,但因为可能是二级索引,不是主键有序,所以先sort再union(问题来了,这里为什么又愿意排序,交集是由多到少,并集是由少到多,对少的排序效率能接受,且不白干活,数据都是最终要返回的---猜的哈)
4.参考文档
https://juejin.cn/post/7071865447108313095