今天看到MYSQL手册的索引合并优化,不禁有一些想法,所以记录如下文
先来解释下2种方式不同:
这两种方式都使用一个表中的不同二级索引进行,注意是单个表。
合并联盟:在使用或的时候如果二级索引包含了所有的关键部分,那么就可以得到排序好的聚集索引的键值或者ROWID,那么简单的联盟去重就可以了,不需要额外的排序
,,,,,,,源码接口quick_ror_union_select类
合并sort_union:和上面的不同的是没有包含二级索引所有的关键部分,那么要首先要获得排序好的聚集索引键值或者ROWID,才能对聚集索引键值或者ROWID进行工会操作
,,,,,,,,,源码接口quick_index_merge_select
参考手册:9.2.1.4索引合并优化
总的来说只要mysql不能确定主键是排序好的方式就需要额外的排序操作。
如果我们对归并排序算法有一定了解,可以看到这样的处理是必须的,
我们知道在进行归并的时候所有的需要归并的子集是需要排序好的,下面是一个简单的归并算法的图解:
MYSQL合并工会合并sort_union的不同
先来解释下2种方式不同:
这两种方式都使用一个表中的不同二级索引进行,注意是单个表。
合并联盟:在使用或的时候如果二级索引包含了所有的关键部分,那么就可以得到排序好的聚集索引的键值或者ROWID,那么简单的联盟去重就可以了,不需要额外的排序
,,,,,,,源码接口quick_ror_union_select类
合并sort_union:和上面的不同的是没有包含二级索引所有的关键部分,那么要首先要获得排序好的聚集索引键值或者ROWID,才能对聚集索引键值或者ROWID进行工会操作
,,,,,,,,,源码接口quick_index_merge_select
参考手册:9.2.1.4索引合并优化
总的来说只要mysql不能确定主键是排序好的方式就需要额外的排序操作。
如果我们对归并排序算法有一定了解,可以看到这样的处理是必须的,
我们知道在进行归并的时候所有的需要归并的子集是需要排序好的,下面是一个简单的归并算法的图解:
MYSQL合并工会合并sort_union的不同