索引合并访问方法使用对多个范围扫描来检索行,并将这些检索到的行合并在一起。此访问方法仅合并来自单个表的索引扫描,而不能来自跨多个表扫描。在这些基础扫描获取的行集基础上,合并可以产生并集、交集或交集后并集。
以下是可以使用索引合并的查询示例:(说明:keyN是索引,key1_part1 和 key1_part2表示多列复合索引的两个列,non_key表示无索引)
SELECT * FROM tbl_name WHERE key1 = 10 OR key2 = 20;
SELECT * FROM tbl_name WHERE (key1 = 10 OR key2 = 20) AND non_key = 30;
SELECT * FROM t1, t2
WHERE (t1.key1 IN (1, 2) OR t1.key2 LIKE 'value%')
AND t2.key1 = t1.some_col;
SELECT * FROM t1, t2
WHERE t1.key1 = 1
AND (t2.key1 = t1.some_col OR t2.key2 = t1.some_col2);
注意: 该指数的合并优化算法具有以下已知的限制: 如果你查询有一个复杂其中的条款与深和/或筑巢和MySQL 不选择最优化计划,试图分发方面使用下列的身份 转换:
(x AND y) OR z => (x OR z) AND (y OR z)
(x OR y) AND z => (x AND z) OR (y AND z)
指标合并不是适用于全文索引。
在解释输出,索引的合并方法出现为index_merge的类型列。 在这种情况下,关键柱包含一系列的索引用,并key_len含有一个列表中的最关键的部分对这些索引。 该指数的合并访问的方法有几种算法,这些都显示在外场的解释输出:
-
使用交叉(...)
-
使用联盟(...)
-
使用sort_union(...)
以下各节描述了这些算法更加详细的说明。 优化器选择之间不同的可能的指标合并的算法和其他访问方法的基础上估计费用各种可用的选项。
-
指标合并交叉问算法
-
指标合并联盟访问算法
-
指标合并排序-联合访问的算法
-
影响指标合并优化
指标合并交叉问算法
这种访问算法适用时,一个其中的条款转化为几项条件的范围在不同的钥匙合并,每个条件是下列之一:
-
N部分表达这种形式,其中的指数具有完全N部分(也就是说,所有索引的部分是复盖):
key_part1 = const1 AND key_part2 = const2 ... AND key_partN = constN
任何范围条件的主要关键的一个少表。 实例:
SELECT * FROM innodb_table
WHERE primary_key < 10 AND key_col1 = 20;
SELECT * FROM tbl_name
WHERE key1_part1 = 1 AND key1_part2 = 2 AND key2 = 2;
该指数的合并交叉点算法进行同步扫描在所有使用索引和产生的交叉路口的行列,它接收到从合并指扫描。
如果所有列在查询中使用涵盖使用的指标,充分表行不检索到(解释输出含有使用索引的额外领域,在这种情况下)。 这里是一例这样的查询:
SELECT COUNT(*) FROM t1 WHERE key1 = 1 AND key2 = 1;
如果使用的索引不涵盖所有列中使用的查询,充分行检索,只有当范围的条件为所有用钥匙都得到满足。
如果一个合并的条件是有条件的主要关键的一个少表,它不是用于行检索,但是用于筛选出行检索使用其他条件。 指标合并联盟访问算法 标准对于这个算法的那些类似的指标合并交叉点算法。 算法是适用时表的其中的条款转化为几项条件的范围在不同的钥匙结合或者,每一个条件是下列之一:
-
N部分表达这种形式,其中的指数具有完全N部分(也就是说,所有索引的部分是复盖):
key_part1 = const1 OR key_part2 = const2 ... OR key_partN = constN
-
任何范围的条件在一个主要关键的一个少表。
-
一个条件,其索引的合并交叉点算法是适用的。
实例:
SELECT * FROM t1
WHERE key1 = 1 OR key2 = 2 OR key3 = 3;
SELECT * FROM innodb_table
WHERE (key1 = 1 AND key2 = 2)
OR (key3 = 'foo' AND key4 = 'bar') AND key5 = 5;
指标合并排序-联合访问的算法
这种访问算法适用时,其中的条款转化为几项条件的范围结合或通过,但是索引合并联盟的算法是不适用的。
实例:
SELECT * FROM tbl_name
WHERE key_col1 < 10 OR key_col2 < 20;
SELECT * FROM tbl_name
WHERE (key_col1 > 10 OR key_col2 = 20) AND nonkey_col = 30;
之间的差别排序-联合算法和联盟的算法是,这种联盟的算法必须首先取行Id所有行和排他们返回之前,任何行。 影响指标合并优化
使用的指标合并受到价值的
index_merge,index_merge_intersection,index_merge_union,并index_merge_sort_union标志的optimizer_switch系统变量。 见第8.9.2,"可切换的优化". 默认情况下,所有那些标志。 使只有某些算法,设index_merge到关闭,只允许这类人以应被允许的。
除了使用optimizer_switch系统变量控制,优化使用的指标合并的算法会议范围内,MySQL支持优化暗示来影响的优化每个语句的基础。