MySQL 索引合并
是在 MySQL 5.0 后引入的的索引合并策略,它将每个索引查询的结果进行合并。
合并算法有三种:intersect(交集)、union(并集)、sort_union(不常见)。
在某些时候索引合并是一种优化策略,但实际上更多时候它也说明表上的索引建得很糟糕:
- 当出现
using intersect
(多个AND条件),更应该创建相关列的复合索引,而不是多个独立的单列索引 - 当出现
using union
时,通常会耗费大量的 CPU 和内存资源用在缓存、排序、合并等操作上。特别是有的单列索引的选择性不高,需要合并扫描返回大量的数据 - 更重要的是,MySQL 优化器不会将这些操作算入查询成本,优化器只关心随机页面的读取。从而低估查询成本,可能导致执行计划还不如直接进行全表扫描。
如果在 explain 中看到 index_merge
,应该好好检查表结构和查询语句是否是最优的。