mysql 排序长度限制之max_length_for_sort_data以及mysql两种排序算法

SET max_length_for_sort_data = 1024mysql

SHOW VARIABLES LIKE '%max_length_for_sort_data%';算法

查询:SELECT * FROM CS_COLUMNS ORDER BY table_name,column_name LIMIT 0,100sql

错误代码: 1815
Internal error: IDB-2015: Sorting length exceeded. Session variable max_length_for_sort_data needs to be set higher.指针

执行耗时 : 7.171 sec排序

mysql有两种文件排序算法(双路排序和单路排序),若是须要排序的列的总大小加上order by列的大小超过了 max_length_for_sort_data定义的字节,mysql就会使用双路排序,当任何须要的列甚至不是用order by的列(text.blob的时候),也会使用双路排序,(可使用substtring() 把这些列转化为能够单路排序的列)。内存

能够经过改变 max_length_for_sort_data变量的值来影响mysql选择的算法。由于单路排序为将要排序的每一行建立了固定的缓冲区,varchar列的最大长度是 max_length_for_sort_data规定的值,而不是排序数据的实际大小。io

当mysql不得不对text。blob列进行排序时,它只会使用前缀并忽略剩余的值,这是由于不得不分配固定大小的结构来容纳数据而且从外部存储中将前缀拷贝回结构中,可使用max_sort_length定义前缀应该是多大。table

mysql并不会真正的显示使用的是哪一种算法,若是增大了max_length_for_sort_data的值,而且磁盘使用率上升,cpu使用率降低,sort_merge_passes的值比之前增长的更快,也许该强制排序使用单路排序算法。效率


双路排序:
读取行指针和order by列,对他们进行排序,而后扫描已经排序好的列表,按照列表中的值从新从列表中读取对应的数据输出。
双路排序的开销可能会很是巨大,由于他会读取表两次,第二次读取会引起大量的随机IO,对于myisam涞说,这个代价尤为昂贵,myisam表利用系统调用去提取每行的数据。变量

单路排序:读取查询须要的全部列,按照order by 列对他们进行排序,而后扫描排序后的列表进行输出,它的效率更快一些,避免了第二次读取数据。而且把随机IO变成了顺序IO,可是它会使用更多的空间,由于它把每一行都保存在内存中了。

相关文章
相关标签/搜索