8.2.1.4 Index Merge Optimization
2015-08-24 14:24
417 查看
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
索引合并方法用于检索记录用几个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
相关文章推荐
- Linux Ubuntu server安装Java JDK1.7_55
- linux note
- linux环境下jdk相关的出现中文乱码
- mtk display 架构
- Nginx 动态生成缩略图
- FMS2015:RISL软件架构保障系统持续高性能
- linux nginx service nginx restart [fail]
- 架构、框架和设计模式关系
- 使用apache JMeter进行web服务器的性能/压力/负载测试
- shell 使用字典
- linux下安装eaccelerator加速php执行效率
- OpenvSwitch架构
- 1.4、安装Docker Compose
- Linux的inode、软链接、硬链接
- Linux命令:sort的使用方法
- Linux 下安装 Python 3.4
- Nginx日志分析
- linux下json库的编译及例程
- FMS2015:Instruction-Based NPU设计
- linux 上安装postgresql 并配置pgadmin iii连接