8.2.1.4 Index Merge Optimization 索引合并优化

8.2.1.4 Index Merge Optimization 索引合并优化

索引合并方法用于检索行数通过几个range scans和merge 它们的结果集到一个结果集,

merge 可以产生unions,intersections或者unions-of-intersections 它的依赖扫描。

这种访问方法合并index scan 从一个单独的表,它不能合并跨越多个表的scan.

合并一个表上的多个列的访问:

在EXPLAIN 输出里,一个Index Merge 方法出现为index_merge 在类型列里。

在这种情况下,索引列包含一个索引的列表。

索引合并例子:

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 合并优化算法有下面的不足之处:

如果你的查询有一个复杂的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之前, 如果一个range scan 是可能的在一些索引上,

优化器不会使用 Index Merge Union or Index Merge Sort-Union algorithms.

比如,考虑下面的查询:

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

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

次访问算法可以采用当一个WHERE 子句被转换成几个range 条件在不同的keys 用AND 连接,

每个条件如下:

在这种形式下,index 有确切的 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;

如果所有的列用于查询是被转换通过使用的索引,

全表记录不是被检索的( EXPLAIN 输出包含使用Index 在额外的字段在这种情况下。

SELECT COUNT(*) FROM t1 WHERE key1=1 AND key2=1;

如果使用的索引不转换所有查询中使用的列, 全部的记录会被检索

只有当range 条件对于所有使用的keys 是满足的

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