在MySQL中,ORDER BY的实现有如下两种类型:
(1)通过有序索引直接取得有序的数据,不用进行任何排序操作即可满足客户端要求
(2)通过MySQL的排序算法将数据进行排序,再将排序后的数据返回给客户端
通过索引得到有序数据是最理想的,但实际情况中常常会遇到第二种情况
如果没有索引可利用时,MySQL又如何实现排序呢?
MySQL目前可以通过两种算法来实现数据的排序操作:
(1)取出满足过滤条件、并作为排序条件的字段,及其行指针信息,在Sort Buffer中进行实际的排序操作,然后根据行指针信息到表中取得其他字段的数据,再返回给客户端
(2)根据过滤条件,一次取出排序字段及需要的其他字段,并将不须要排序的字段存放在一块内存区域中,然后在 Sort Buffer中对排序字段进行排序,最后再用排序后的行指针到内存区域中找到其他字段,合并成结果集返回给客户端
第一种排序算法是MySQL一直以来就有的,而第二种则是从MySQL 4.1版本才开始增加的改进版排序算法。第二种的主要优势就是减少了数据的二次访问。在排序之后不须要再一次回到表中取数据,节省了IO操作。当然,会消耗更多的内存,这正是一种典型的通过内存空间换取时间的优化方式