zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    C++调用WebService
    vs2005 环境的字体和颜色的设置
    自娱自乐~经典24点游戏
    再探利用C++的STL和堆栈编程思想实现数学四则运算计算结果
    如何在Linux中关闭apache服务(转)
    ios推送:本地通知UILocalNotification
    ASIHTTPRequest的使用(转)
    实战新浪微博、腾讯微博的分享功能(转)
    UIImagePickerController拍照与摄像(转)
    iOS通过http post上传图片 (转)
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13351437.html
Copyright © 2011-2022 走看看