在多数情况下,可以通过索引来简化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是不能够应用到索引来进行排序的;