MySQL 常用配置變量-max_length_for_sort_data

控制 MySQL 排序的最大字段定義的列總字節長度

  • mysql 有兩種文件排序算法(雙路排序和單路排序),如果需要排序的列的總大小加上 order by 列的大小超過了max_length_for_sort_data 定義的字節,mysql 就會使用雙路排序,當任何需要的列(包含結果集列和 order by 的列)包含text、blob 列時,也會使用雙路排序,(可以使用 subsstring()把這些列轉化爲可以單路排序的列)。
  • 可以通過改變 max_length_for_sort_data 變量的值來影響mysql 選擇的算法。因爲單路排序要將排序的每一行創建固定的緩衝區,varchar 列的最大長度是 max_length_for_sort_data規定的值,而不是排序數據的實際大小(5.7.x 版本中對排序做了優化,分配排序緩衝時針對變長列可以根據數據實際佔用的大小來分配內存)。
  • 當 MySQl 不得不對 text、blob 列進行排序時,它只會使用前綴並忽略剩餘的值,這是因爲不得不分配固定大小的結構來容納數據並且從外部存儲中將前綴拷貝回結構中,可以使用max_sort_length 定義前綴應該是多大。
  • mysql 並不能查看某個查詢執行時內部使用的是哪種算法,如果增大了 max_length_for_sort_data 的值,並且磁盤使用率上升,cpu 使用率下降,Sort_merge_passes 的值比以前增加的更快,也許該強制排序使用單路排序算法。* 雙路排序:讀取行指針和 order by 列,對他們進行排序,然後掃描已經排序好的列表,按照列表中的值重新從列表中讀取對應的數據輸出。雙路排序的開銷可能會非常巨大,因爲他會讀取表兩次,第二次讀取會引發大量的隨機 I/O,對於 MyISAM 淶說,這個代價尤其昂貴,MyISAM 表利用系統調用去提取每行的數據。

    * 單路排序:讀取查詢需要的所有列,按照 order by 列對他們進行排序,然後掃描排序後的列表進行輸出,它的效率更快一些,避免了第二次讀取數據。並且把隨機 I/O 變成了順序 I/O,但是它會使用更多的內存空間,因爲它把排序需要的所有列都一次性度的去出來保存在內存中了。

  • 全局,會話,動態變量,整型值,單位爲字節,取值範圍4~8388608 字節,默認值爲 1024 字節。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章