4.3 索引合并优化
该指数合并与多址接入方式检索行 range扫描并合并他们的结果为一体。此访问方法仅合并来自单个表的索引扫描,而不合并多个表的扫描。合并可以产生其基础扫描的并集,相交或相交。
可能使用索引合并的示例查询:
注意
索引合并优化算法具有以下已知限制:
如果您的查询包含
WHERE
带有深度AND
/OR
嵌套的复杂子句, 而MySQL没有选择最佳计划,请尝试使用以下身份转换来分发术语:索引合并不适用于全文索引。
在EXPLAIN
输出中,索引合并方法出现 index_merge
在 type
列中。在这种情况下,该 key
列包含使用的索引列表,并key_len
包含这些索引的最长键部分的列表。
索引合并访问方法具有几种算法,这些算法显示在输出Extra
字段中 EXPLAIN
:
Using intersect(...)
Using union(...)
Using sort_union(...)
以下各节将更详细地描述这些算法。优化程序根据各种可用选项的成本估算,在可能的索引合并算法和其他访问方法之间进行选择。
索引合并的使用是受价值 index_merge
, index_merge_intersection
, index_merge_union
,和 index_merge_sort_union
该旗 optimizer_switch
系统变量。默认情况下,所有这些标志均为on
。要仅启用某些算法,请将设置index_merge
为 off
,并仅启用应允许的其他算法。
索引合并路口访问算法
当WHERE
子句在与键组合在一起的不同键上转换为多个范围条件 AND
,并且每个条件是以下条件之一时,此访问算法适用 :
*
N
*此形式 的-part表达式,其中索引具有完全相同的 *N
*部分(即,所有索引部分均被覆盖):InnoDB
表 主键上的任何范围条件 。
例子:
索引合并交集算法对所有使用的索引执行同时扫描,并生成从合并索引扫描中接收到的行序列的交集。
如果查询中使用的所有列都被使用的索引覆盖,则不会检索完整的表行( 在这种情况下,EXPLAIN
输出包含 Using index
在Extra
字段中)。这是此类查询的示例:
如果使用的索引未覆盖查询中使用的所有列,则仅在满足所有使用的键的范围条件时才检索完整行。
如果合并的条件之一是InnoDB
表主键上的条件,则该条件不用于行检索,而是用于过滤出使用其他条件检索的行。
索引合并联合访问算法
此算法的标准类似于索引合并交集算法的标准。当表的WHERE
子句在与键组合在一起的不同键上转换为多个范围条件OR
,并且每个条件为以下条件之一时,该算法适用:
*
N
*此形式 的-part表达式,其中索引具有完全相同的 *N
*部分(即,所有索引部分均被覆盖):InnoDB
表 主键上的任何范围条件 。索引合并交集算法适用的条件。
例子:
索引合并排序联合访问算法
当将WHERE
子句转换为由组合的多个范围条件 时,此访问算法适用 OR
,但索引合并并集算法不适用。
例子:
sort-union算法和union算法之间的区别在于,sort-union算法必须首先获取所有行的行ID,然后对它们进行排序,然后再返回任何行。
Last updated