MySQL優化之單路排序(多路排序)
阿新 • • 發佈:2022-05-27
一、應用場景
- SQL未命中索引時,filesort所使用的演算法
二、產生原因
-
filesort:當SQL含有order等排序執行,並且欄位不命中索引;此時SQL執行檔案排序”filesort“
-
排序演算法:4.1以前雙路排序、4.1之後單路排序
-
雙路排序:兩次磁碟;取order欄位和資料指標進記憶體,排序完成後回表查詢其他資料
-
單路排序:一次磁碟;取order欄位和其他所有欄位進記憶體,排序完後直接返回
-
記憶體限制:sort_buffer_size每個程序記憶體緩衝區、max_length_for_sort_data每個執行快取資料量
-
三、解決方案
-
案例
# 表為 INSERT INTO TABLE A (F_ID,F_ID2,F_NAME) values(1,1,'NAME'); # 假如列F_ID為主鍵索引,F_ID2為二級索引 select F_ID2,F_NAME from A order by F_ID2; ## 雙路排序:第一次讀取磁碟F_ID2和隱藏行指標排序,然後回表查詢磁碟對應F_NAME ## 單路排序:第一次讀取磁碟F_ID2和F_NAME排序,然後直接返回結果
四、引數
引數 | 作用和優點 | 缺點 |
---|---|---|
sort_buffer_size | 存放待排序資料:資料量小於緩衝區時,記憶體排序 | 當資料量大於緩衝區,則進行普通磁碟排序 |
max_length_for_sort_data | 資料行數;資料量決定排序演算法 | 當資料量較小時使用雙路排序,較大時使用單路排序 |