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,可是它會使用更多的空間,由於它把每一行都保存在內存中了。