MySQL之order by 优化(1)

来源:互联网 发布:知乎每周精选232期 编辑:程序博客网 时间:2024/05/17 16:57

在多数情况下,可以通过索引来简化order by的操作,而不需要额外的using filesort来重新进行排序,但是order by中出现的排序的列需要满足最左前缀索引,

注意(个人实操结果):当所选取的列,即select中出现的列不出现在order by中索引的时候,则不会对ordr by 进行优化,即所选取的列与order by待排序的列是一致的,不然仍然会使用using filesort;

例如以下的一些sql语句均可order by的查询:

1.select * from table order by key_part1,key_part_2...

2..select * from table where key_part1=constant order by key_part2;

3.select * from table order by key_part1 desc ,key_part_2 desc;

4.select * from table order by  where key_part1=CONST key_part1 desc ,key_part_2 desc;

5.select * from table order by  where key_part1>CONST key_part1 desc;

6.select * from table order by  where key_part1<CONST key_part1 desc;

7.select * from table order by  where key_part1=CONST1 and key_part2>const2  order by key_part2 desc;

当然还有以下语句不能使用索引来简化order by 的消耗

1.order by 中使用了不同的索引,例如select  * from table order by  key1,key2;

2.order by 中不是使用最左前缀索引;例如select *fro mtable where key2=const order by key_part2;

3.order by中使用了混合的排序关键之,asc和desc;

4.where中的用到的索引与order by中的索引不同,例如;select *from t where key2=const order by  key1;

5.oder by中使用了一些对相应的索引使用了一些数学计算表达式:例如:select *from table order by abs(key1)或select *from table order by -key1;

6.查询语句当中有不同的order by和group语句

7.order by中出现的列所对应的索引只是索引列的一个前缀;

8.对应的行是不是有序的,例如memory表中的hash索引;

9.小心别名的应用,例如select abs(a) as a select from table order by a是不能够应用到索引来进行排序的;


1 0