MySQL 索引合并

是在 MySQL 5.0 后引入的的索引合并策略,它将每个索引查询的结果进行合并。

合并算法有三种:intersect(交集)、union(并集)、sort_union(不常见)。

在某些时候索引合并是一种优化策略,但实际上更多时候它也说明表上的索引建得很糟糕

  • 当出现 using intersect(多个AND条件),更应该创建相关列的复合索引,而不是多个独立的单列索引
  • 当出现 using union 时,通常会耗费大量的 CPU 和内存资源用在缓存、排序、合并等操作上。特别是有的单列索引的选择性不高,需要合并扫描返回大量的数据
  • 更重要的是,MySQL 优化器不会将这些操作算入查询成本,优化器只关心随机页面的读取。从而低估查询成本,可能导致执行计划还不如直接进行全表扫描。

如果在 explain 中看到 index_merge,应该好好检查表结构和查询语句是否是最优的。

引用

  1. MySQL:索引合并
  2. mysql索引合并:一条sql可以使用多个索引
作者

Jakes Lee

发布于

2021-09-04

更新于

2021-11-24

许可协议

评论