8.2.1.4 Index Merge Optimization

8.2.1.4 Index Merge Optimization

索引合并方法用于检索记录用几个range scans,合并它们的结果到一个。merge可以产生unions,intersections,或者 unions-of-intersections of its underlying scans.

这个中访问方法合并index scan 从一个表, 它不合并scan 跨越多个表。

在EXPLAIN 输出中, 索引合并方式出现作为index_merge作为列类型。 在这种情况下, 键列包含使用索引的列表,

Examples:

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);

索引合并方法有几个访问算法

Using intersect(…)

Using union(…)

Using sort_union(…)

下面的章节详细描述了这些方法:

注意:

index merge 优化算法有以下已知的不足之处:

如果你的查询是一个复杂的where 语句, 有多层的AND/OR 嵌套,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)

索引合并不适用于全文索引:

在Mysql 5.6.6前, 如果 范围扫描在一些Key上, 优化器不会认为使用Index Merge Union 或者 Index Sort-Union 算法:

SELECT * FROM t1 WHERE (goodkey1 < 10 OR goodkey2 < 20) AND badkey < 30;

对于这个查询,两种计划是可能的:

1.一个Index 合并 Scan 使用(goodkey1 < 10 OR goodkey2 < 20)条件

2.range scan 使用 badkey < 30

然而,优化器只考虑第2种计划

8.2.1.4.1 The Index Merge Intersection Access Algorithm (索引合并 交叉访问算法)

次访问算法可能被采用当 WHERE 语句被转换成多个range 调价在不同的keys上 用AND 结合,

在这种形式中,该key 有精确的N部分(也就是说,所有的index 部分被转换)

key_part1=const1 AND key_part2=const2 … AND key_partN=constN

原文地址:https://www.cnblogs.com/hzcya1995/p/13351437.html