MYSQL合并工会合并sort_union的不同

  今天看到MYSQL手册的索引合并优化,不禁有一些想法,所以记录如下文
  
  先来解释下2种方式不同:
  这两种方式都使用一个表中的不同二级索引进行,注意是单个表。
  合并联盟:在使用或的时候如果二级索引包含了所有的关键部分,那么就可以得到排序好的聚集索引的键值或者ROWID,那么简单的联盟去重就可以了,不需要额外的排序
  ,,,,,,,源码接口quick_ror_union_select类
  合并sort_union:和上面的不同的是没有包含二级索引所有的关键部分,那么要首先要获得排序好的聚集索引键值或者ROWID,才能对聚集索引键值或者ROWID进行工会操作
  ,,,,,,,,,源码接口quick_index_merge_select
  参考手册:9.2.1.4索引合并优化
  总的来说只要mysql不能确定主键是排序好的方式就需要额外的排序操作。
  
  
  如果我们对归并排序算法有一定了解,可以看到这样的处理是必须的,
  我们知道在进行归并的时候所有的需要归并的子集是需要排序好的,下面是一个简单的归并算法的图解:
   MYSQL合并工会合并sort_union的不同“> <br/>
  <br/>
  如果我们把1 2 5 9和3 4 7 8看成主键那么他们就是要排序好才能完成最后的归并,<br/>
  当然上层的排序操作可以归并也可以用其他排序方式,只要排序好就可以,另外提一点,归并<br/>
  排序熟悉数据结构的朋友应该知道他也是外部磁盘排序的一种好方式。<br/>
  <br/>
  这里要理解我们需要对组合索引在INNODB B +树页块的排列有一个了解:<br/>
  比如:seq int, int id1、id2 int, seq是主键,id1、DI2是一个组合B +索引<br/>
  那么我们插入值<br/>
  值(1,1,2)<br/>
  值(2,1,3)<br/>
  值(3、1、2)<br/>
  <br/>
  显然在组合索引的叶节点排列顺序如下:<br/>
  <br/>
  1,,,2,,,3 <br/>
  id1:1, id1:1, id1:1 <br/>
  id2:2, id2:2, id2:3 <br/>
  seq: 1, seq: 3, seq: 2 <br/>
  <br/>
  也就是先按照id1进行排序然后按照id2排序最后按照主键seq排序。<br/>
  那么可以看到最后主键的顺序为1 3 2并不是有序的,很明显这样的<br/>
  结果集不能作为归并的结果集,那么我们就需要进行排序,这也是为什么<br/>
  sort_union排序的来源。<br/>
  <br/>
  那么下面来演示2种执行计划的不同<br/>
  脚本:<br/>
  创建表testmer <br/>
  (id1 int, int seq id2 int, int id3, id4 int,主键(seq)、关键(id1, id2)、关键(id3 id4)); <br/>
  <br/>
  插入testmer值(1,1,2,4,4);<br/>
  插入testmer值(2,1,3,4,5);<br/>
  插入testmer值(3、1、2、4,4);<br/>
  插入testmer值(4、2、4、5、6),<br/>
  插入testmer值(5、2、6、5、8);<br/>
  插入testmer值(6 2 10、5、3),<br/>
  插入testmer值(7,4、5、8、10);<br/>
  插入testmer值(8 0,1,3,4),<br/>
  <br/>
  mysql>select * from testmer; <br/>
  + - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - + + <br/>
  | seq | id1, | id2, | id3, | id4, | <br/>
  + - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - + + <br/>
  |,1 |,1 |大敌;2 |大敌;4 |大敌;,4 | <br/>
  |,2 |,1 |大敌;3 |大敌;4 |大敌;,5 | <br/>
  |,3 |,1 |大敌;2 |大敌;4 |大敌;,4 | <br/>
  |,4 |,2 |大敌;4 |大敌;5 |大敌;,6 | <br/>
  |,5 |,2 |大敌;6 |大敌;5 |大敌;,8 | <br/>
  |,6 |,2 |大敌;10 |,5 |大敌;,3 | <br/>
  |,7 |,4 |大敌;5 |大敌;8 |大敌;10 | <br/>
  |,8 |,0 |大敌;1 |大敌;3 |大敌;,4 | <br/>
  + - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - + + <br/>
  <br/>
  使用sort_union: <br/>
  mysql>解释,select * from testmer力指数(id1、id3) id1=1或id3=4; <br/>
  + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + <br/>
  | | id select_type |表,| |分区类型,,,,| possible_keys |关键,,行| key_len | ref, | | |过滤多余的,,,,,,,,,,,,,,,,,| <br/>
  + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + <br/>
  | 1 |简单的祝福;,,| testmer |空,,,| index_merge | id1、id3,,,| id1 id3 | 5 5,,零| |,6 |大敌;100.00 |使用sort_union (id1、id3);使用在| <h2 class=MYSQL合并工会合并sort_union的不同