1. 8.2.1.4 Index Merge Optimization 索引合并优化:
  2.  
  3. 索引合并方法是用于检索记录 使用多个 范围扫描和合并它们的结果集到一起
  4.  
  5. mysql> show index from ClientInvestOrder;
  6. +-------------------+------------+------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
  7. | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
  8. +-------------------+------------+------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
  9. | ClientInvestOrder | 0 | PRIMARY | 1 | sn | A | 11466 | NULL | NULL | | BTREE | | |
  10. | ClientInvestOrder | 0 | orderNo | 1 | orderNo | A | 11466 | NULL | NULL | | BTREE | | |
  11. | ClientInvestOrder | 1 | ClientInvestOrder_idx1 | 1 | clientSn | A | 1263 | NULL | NULL | | BTREE | | |
  12. +-------------------+------------+------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
  13. 3 rows in set (0.00 sec)
  14.  
  15. mysql> explain select * from ClientInvestOrder where clientSn=12804;
  16. +----+-------------+-------------------+------------+------+------------------------+------------------------+---------+-------+------+----------+-------+
  17. | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
  18. +----+-------------+-------------------+------------+------+------------------------+------------------------+---------+-------+------+----------+-------+
  19. | 1 | SIMPLE | ClientInvestOrder | NULL | ref | ClientInvestOrder_idx1 | ClientInvestOrder_idx1 | 4 | const | 7 | 100.00 | NULL |
  20. +----+-------------+-------------------+------------+------+------------------------+------------------------+---------+-------+------+----------+-------+
  21. 1 row in set, 1 warning (0.00 sec)
  22.  
  23. mysql> explain select * from ClientInvestOrder where productSn=747 and clientSn=12804;
  24. +----+-------------+-------------------+------------+------+------------------------+------------------------+---------+-------+------+----------+-------------+
  25. | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
  26. +----+-------------+-------------------+------------+------+------------------------+------------------------+---------+-------+------+----------+-------------+
  27. | 1 | SIMPLE | ClientInvestOrder | NULL | ref | ClientInvestOrder_idx1 | ClientInvestOrder_idx1 | 4 | const | 7 | 10.00 | Using where |
  28. +----+-------------+-------------------+------------+------+------------------------+------------------------+---------+-------+------+----------+-------------+
  29. 1 row in set, 1 warning (0.00 sec)
  30.  
  31. mysql> create index ClientInvestOrder_idx2 on ClientInvestOrder(productSn);
  32. Query OK, 0 rows affected (0.12 sec)
  33. Records: 0 Duplicates: 0 Warnings: 0
  34.  
  35. mysql> explain select * from ClientInvestOrder where productSn=747 and clientSn=12804;
  36. +----+-------------+-------------------+------------+-------------+-----------------------------------------------+-----------------------------------------------+---------+------+------+----------+-----------------------------------------------------------------------------+
  37. | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
  38. +----+-------------+-------------------+------------+-------------+-----------------------------------------------+-----------------------------------------------+---------+------+------+----------+-----------------------------------------------------------------------------+
  39. | 1 | SIMPLE | ClientInvestOrder | NULL | index_merge | ClientInvestOrder_idx1,ClientInvestOrder_idx2 | ClientInvestOrder_idx1,ClientInvestOrder_idx2 | 4,4 | NULL | 1 | 100.00 | Using intersect(ClientInvestOrder_idx1,ClientInvestOrder_idx2); Using where |
  40. +----+-------------+-------------------+------------+-------------+-----------------------------------------------+-----------------------------------------------+---------+------+------+----------+-----------------------------------------------------------------------------+
  41. 1 row in set, 1 warning (0.00 sec)
  42.  
  43. 合并可以产生unions,intersections 或者unions-of-intersections
  44.  
  45. 这个访问方式合并索引扫描从一个单独的表,它不会合并扫描跨越多个表
  46.  
  47. EXPALIN 输出, Index Merge 方法出现作为index_merge 在类型列, 在这种情况下,
  48.  
  49. key 包含了使用的索引的列, key_len 包含那些索引的最长索引部分的列表
  50. Examples:
  51.  
  52. SELECT * FROM tbl_name WHERE key1 = 10 OR key2 = 20;
  53.  
  54. SELECT * FROM tbl_name
  55. WHERE (key1 = 10 OR key2 = 20) AND non_key=30;
  56.  
  57. SELECT * FROM t1, t2
  58. WHERE (t1.key1 IN (1,2) OR t1.key2 LIKE 'value%')
  59. AND t2.key1=t1.some_col;
  60.  
  61. SELECT * FROM t1, t2
  62. WHERE t1.key1=1
  63. AND (t2.key1=t1.some_col OR t2.key2=t1.some_col2);
  64.  
  65. Index 合并方法有几个访问算法(查看EXPLAIN 额外的字段)
  66.  
  67. Using intersect(...)
  68.  
  69. Using union(...)
  70.  
  71. Using sort_union(...)
  72.  
  73. 下面的章节将描述那些方法:
  74.  
  75. 注意:
  76.  
  77. Index 合并优化算法有下面已知的缺陷:
  78.  
  79. 1.如果你的查询是一个复杂的WHERE 子句有嵌套的AND/OR
  80.  
  81. MYSQL 不知道选择合适的执行计划,尝试分散表达式使用下面的规律:
  82.  
  83. (x AND y) OR z = (x OR z) AND (y OR z)
  84.  
  85. (x OR y) AND z = (x AND z) OR (y AND z)
  86.  
  87. 索引合并不适用于全文索引,我们计划在将来的版本中实现
  88.  
  89. MySQL 5.6.6之前,如果一个range scan是可能的在一些索引上,
  90.  
  91. 优化器不会考虑使用Index 合并 union 或者Index合并Sort-Union算法,比如,考虑下面的查询:
  92.  
  93. SELECT * FROM t1 WHERE (goodkey1 < 10 OR goodkey2 < 20) AND badkey < 30;
  94.  
  95. 对于这个查询,两个计划是可能的:
  96.  
  97. 1.index 合并scan 使用 (goodkey1 < 10 OR goodkey2 < 20) condition.
  98.  
  99. 2.一个range scan 使用badkey < 30 condition.
  100.  
  101. 然而, 优化器只考虑第2个计划
  102.  
  103. 选择在不同的可能索引合并访问方法的变体
  104.  
  105. 在不同的可能的Index Merge 访问方法和其他访问方法的区别是基于成各种变量选项的成本评估
  106.  
  107. 8.2.1.4 索引合并交叉访问算法:
  108.  
  109. 这个访问算法可以被利用当一个WHERE 子句被转换成多个范围条件在不同的keys 使用AND连接,
  110.  
  111. 每个条件是下面中的一个:
  112.  
  113. 在这种形式下, indexN部分(有就是说,所有的index部分是被覆盖的)
  114.  
  115. key_part1=const1 AND key_part2=const2 ... AND key_partN=constN
  116.  
  117. 任何范围条件覆盖一个InnoDB表的主键
  118.  
  119. 例子:
  120.  
  121. SELECT * FROM innodb_table WHERE primary_key < 10 AND key_col1=20;
  122.  
  123. SELECT * FROM tbl_name
  124. WHERE (key1_part1=1 AND key1_part2=2) AND key2=2;
  125.  
  126. Index 合并交叉算法执行并发的扫描在所有被使用的索引和
  127.  
  128. 产生记录顺序的交集 它从合并的Index 扫描接收
  129.  
  130. 如果所有的列 用于在查询是通过使用的索引覆盖,full table 记录 不是被检索的
  131.  
  132. (EXPLAIN 输出包含使用的索引在额外字段)这里有一个查询的例子:
  133.  
  134. SELECT COUNT(*) FROM t1 WHERE key1=1 AND key2=1;
  135.  
  136. 如果 被使用的索引不覆盖所有的列在查询里,全部的记录是被接收只有当范围条件对于那些使用的索引被满足
  137.  
  138. 如果其中一个合并条件是一个条件覆盖了一个InnoDB表的主键,
  139.  
  140. 它不用于行检索,但是用于过滤检索的记录用于其他条件
  141.  
  142. 8.2.1.4.2 The Index Merge Union Access Algorithm 索引合并联合访问算法

8.2.1.4 Index Merge Optimization 索引合并优化:的更多相关文章

  1. MySQL Index Merge Optimization

    Index Merge用在通过一些range scans得到检索数据行和合并成一个整体.合并可以通过 unions,intersections,或者unions-intersection运用在底层的扫 ...

  2. MySQL 优化之 index merge(索引合并)

    深入理解 index merge 是使用索引进行优化的重要基础之一.理解了 index merge 技术,我们才知道应该如何在表上建立索引. 1. 为什么会有index merge 我们的 where ...

  3. index merge的一次优化

    手机微博4040端口SQL优化 现象 某端口常态化延迟,通过使用pt-query-digest发现主要由于一条count(*)语句引发,具体如下: # .5s .58M rss, .84M vsz # ...

  4. MySQL 查询优化之 Index Merge

    MySQL 查询优化之 Index Merge Index Merge Intersection 访问算法 Index Merge Union 访问算法 Index Merge Sort-Union ...

  5. MySQL中Index Merge简介

    索引合并优化 官网翻译 MySQL5.7文档 索引合并是为了减少几个范围(type中的range类型:range can be used when a key column is compared t ...

  6. MySQL 优化之 index_merge (索引合并)

    深入理解 index merge 是使用索引进行优化的重要基础之一.理解了 index merge 技术,我们才知道应该如何在表上建立索引. 1. 为什么会有index merge 我们的 where ...

  7. mysql索引及优化

    索引; 2.索引入门对于任何DBMS,索引都是进行优化的最主要的因素.对于少量的数据,没有合适的索引影响不是很大,但是,当随着数据量的增加,性能会急剧下降.如果对多列进行索引(组合索引),列的顺序非常 ...

  8. MySql 索引 查询 优化

    官方文档: https://dev.mysql.com/doc/refman/5.7/en/explain-output.html#explain_rows type: 连接类型 system 表只有 ...

  9. MySQL 索引的优化

    一.MySQL如何使用索引(index) 1.1 索引概述 索引用于快速查找具有特定列值的行. 如果不使用索引,MySQL必须从表的第一行开始,然后扫描整个表来寻找符合条件的行.这种情况下,表越大,扫 ...

随机推荐

  1. 二维码_encode与decode

    二维码encode和decode工具类 import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.Buffere ...

  2. Android(java)学习笔记249:ContentProvider使用之获得系统联系人信息01

    1.系统联系人的数据库(3张最重要的表) (1)raw_contacts  联系人表        保存联系人的id   contact_id (2)data 数据表       保存联系人的数据 ( ...

  3. Git系列(1) Windows下Git服务器搭建

    作为对前两天Git服务器搭建的一个整理,我想分别从服务端和客户端两个角度来记录下整个搭建过程,为了达到目标,我们需要哪些操作. (一)服务端软件和账号的安装配置 我们这里只需要两个软件git和ssh, ...

  4. php long time(1)

    好久好久没有发表新的文章了,主要是懒得在这里写,都记在记事本上,所得都是自己理解的情况下写的,如今借此闲暇记录下来,:::: ****************PHP****************** ...

  5. 纯 CSS 创建各种不同的图形形状

    使用代码 矩形 .rectangle { width: 250px; height: 150px; background-color: #6DC75F; } <div></div&g ...

  6. CentOS目录结构详解

    CentOS是文件管理系统,在CentOS中所有的程序都以文件形式存储.初学CentOS的朋友需要了解各个挂载点 目录的结构和作用.这样才能更好的去管理系统. CentOS的目录大体上可分为四类:管理 ...

  7. 让一个Activity在开机后自动显示

    Activity本身不会在手机开机后自动运行的.但想让手机开机后就立刻做一些动作,需要使用广播接收器拦截手机开启广播,并在onReceive方法中完成相应的动作,如打开一个Activity. 广播接收 ...

  8. 快速入门cocos2d-x jsbinding

    如果你是一个cocos2d-x的老手,那你可以忽略这篇博文,如果你是一个接触过javascript,想通过HTML5做游戏的,但是苦于不知道如何下手,那么这篇博文可能会帮到你. cocos2dx-js ...

  9. PHPCMS V9二次开发]自定义字段模型-文本组

    phpcms v9,我们在做类似于酒店房型等类型的时候,需要用到文本组字段模型,但phpcms并未提供该模型.如下图所示效果: 展示效果如下: 步骤/方法 打开phpcms\modules\conte ...

  10. DeDe缩略图路径的修改

    今天在使用dedecms的时候,遇到的一点小问题,移站的时候缩略图不显示.然后就去百度搜了一下,出来的都是千篇一律. 因为一个网站里面缩略图太多,手动比较慢而已费时间,  俗话说的好“时间就是生命” ...