概念
MySQL 5.0 之前,一个表一次只能使用一个索引,无法同时使用多个索引分别进行条件扫描。但是从 5.1 版本开始,引入了索引合并(Index Merge)技术,对同一个表可以使用 多个索引分别进行条件扫描
,然后将结果进行合并处理,最后再进行回表查询。
索引合并优点/缺点
优点
- 可以上一条sql预警使用多个索引进行扫描,然后对结果进行合并,减少不必要的回表次数,提高查询效率。
缺点
- 索引合并技术只适合单表查询,不能进行跨表
- 索引合并不适用于全文索引
- 如果 WHERE 语句中存在多层
AND/OR
嵌套,Mysql优化器可能不会选择最优方案,可以尝试拆分WHERE条件(如下代码),转换以应用索引合并技术
1 | WHERE (x AND y) OR z => WHERE (x OR z) AND (y OR z) |
是否用到索引合并
通过(explain)打印 sql
的执行计划,通过执行计划的以下指标来判断使用使用到 索引合并技术
- type:
index_merge
(type字段如果等于:index_merge 说明一定使用到了索引合并) - key:
idx_a,idx_b
(key字段:如果使用了多个索引,说明有可能运用到索引合并) - Extra:
Using union(idx_a,idx_b); Using where
(Extra字段如果包含 Using union/intersect/(idx_a,idx_b) 则证明一定使用到了索引合并)
索引合并三种算法
Using union
表示对多个索引求并集Using intersect
表示对多个索引求交集Using sort_union
表示对查询到的记录先按 rowid 排序再并集
索引合并注意事项
- 如果用到了索引合并,说明索引创建不太合理,建议对使用合并的字段创建组合索引
- 组合索引必须所有索引字段都覆盖到才会使用索引合并
- 实侧:目前索引合并->
Using intersect
这种情况没发生,大部分情况是用到了索引下推
,猜测优化器可能会根据情况选择更合适的方式