概念

MySQL 5.0 之前,一个表一次只能使用一个索引,无法同时使用多个索引分别进行条件扫描。但是从 5.1 版本开始,引入了索引合并(Index Merge)技术,对同一个表可以使用 多个索引分别进行条件扫描 ,然后将结果进行合并处理,最后再进行回表查询。

索引合并优点/缺点

  • 优点

    • 可以上一条sql预警使用多个索引进行扫描,然后对结果进行合并,减少不必要的回表次数,提高查询效率。
  • 缺点

    • 索引合并技术只适合单表查询,不能进行跨表
    • 索引合并不适用于全文索引
    • 如果 WHERE 语句中存在多层 AND/OR 嵌套,Mysql优化器可能不会选择最优方案,可以尝试拆分WHERE条件(如下代码),转换以应用 索引合并技术
1
2
WHERE (x AND y) OR z => WHERE (x OR z) AND (y OR z)
WHERE (x OR y) AND z => WHERE (x AND z) OR (y AND 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) 则证明一定使用到了索引合并)

索引合并三种算法

  1. Using union 表示对多个索引求并集
  2. Using intersect 表示对多个索引求交集
  3. Using sort_union 表示对查询到的记录先按 rowid 排序再并集

索引合并注意事项

  • 如果用到了索引合并,说明索引创建不太合理,建议对使用合并的字段创建组合索引
  • 组合索引必须所有索引字段都覆盖到才会使用索引合并
  • 实侧:目前索引合并-> Using intersect 这种情况没发生,大部分情况是用到了 索引下推,猜测优化器可能会根据情况选择更合适的方式