Union 索引合并的使用条件太苛刻,必须保证各个二级索引列在进行等值匹 配的条件下才可能被用到,比方说下边这个查询就无法使用到 Union 索引合并:
SELECT * FROM order_exp WHERE order_no< ‘a’ OR expire_time> ‘z’
这是因为根据 order_no< ‘a’从 idx_order_no 索引中获取的二级索引记录的主键值不是排好序的,根据 expire_time> ‘z’从 idx_expire_time 索引中获取的二级索引记录的主键值也不是排好序的,但是 order_no< ‘a’和 expire_time> ‘z’’这两个条件又特别让我们动心,所以我们可以这样:
- 先根据 order_no< ‘a’条件从 idx_order_no 二级索引中获取记录,并按照记录的主键值进行排序
- 再根据 expire_time> ‘z’条件从 idx_expire_time 二级索引中获取记录,并按照记录的主键值进行排序
- 因为上述的两个二级索引主键值都是排好序的,剩下的操作和 Union 索引合并方式就一样了。
上述这种先按照二级索引记录的主键值进行排序,之后按照 Union 索引合并方式执行的方式称之为 Sort-Union 索引合并,很显然,这种 Sort-Union 索引合并比单纯的 Union 索引合并多了一步对二级索引记录的主键值排序的过程。