MySQL数据库如何进⾏排序(Sort)操作?
参考后, ⾃已总结⼀下, 有不对的地⽅请指正. 在MySQL中进⾏排序有两种算法, 以4.1版本为分⽔岭, 在此之前排序时的数据只包括ORDER BY中的列和⼀个记录的指针(Sort A), 在4.1之后多了⼀种改进的⽅法, 排序的数据中可以包括SELECT中的列和ORDER BY中的列(Sort B)    Sort A中最主要的坏处是需要进⾏⼆次扫表, 第⼀次是将ORDER BY的列及记录指针读到SORT Buffer中, 然后排序, 如果要排序的数据很多, 不能在内存中完成, 则可能会⽤到临时表(tmpdir)空间. 排完序后再根据记录指针将记录读取到READ RND Buffer中, 这⼀步可能会很慢, 因为这⾥进⾏的读取⼤都是随机读, ⽽不是顺序读.
Sort B中在第⼀次扫描表时将SELECT中的列和ORDER BY的列读到SORT Buffer中, 然后排序, 如果要排序的数据很多, 不能在内存中完成, 则可能会⽤到临时表(tmpdir)空间. 排完序后, 就不需要进⾏⼆次读表了, 因为所有的列都已经在第⼀次中读出来了. 可以想象, 如果SELECT中的字段很多, 记录很长, 那么⼀个Sort Buffer中存放的记录数就少了, 对于同样数量的记录, 就需要进⾏更多次的排序了, 有可能引起效率的降底.
在MySQL中max_length_for_sort_data变量⽤于控制何时采⽤Sort A, 何时采⽤Sort B, 当SELECT中的列和ORDER BY中的列的长度超过这个设置时采⽤Sort A, ⽽在这个以内时采⽤Sort B. 但依据Oracle上的经验, 如果这个SQL最后要返回⼤量记录, 那么应当选⽤Sort B, 我们可以在会话级更改设置, 如果返回的记录很少, 那么可以优先采⽤Sort A, 因为随机读取的成本实在是⽐较⾼的.
mysql中select
这些Buffer都会在SQL运⾏结束时⾃动释放. 还有⼀个问题时, 如果排序中⽤到了临时⽂件, 读取时是不是受到Read Buffer Size的控制?
是会受到read_buffer_size的控制。