【MySQL】FileSort算法

在使用 Explain 關鍵字分析 sql性能,有時會產生 Using Filesort,使用了文件內排序,這是非常不好的.。

MySQL 有兩種 filesort 算法:雙排排序、單路排序。

雙路排序算法

MySQL 4.1 之前使用的雙路排序,通過兩次掃描磁盤得到數據。讀取行指針和 order by 列並對其進行排序,掃描排序好的列表,按照列表中的值重新從列表中讀取對應的數據輸出。

但是雙路排序會掃描兩次磁盤,磁盤IO是非常消耗性能的,所以後面被單路排序取代。

單路排序算法

從磁盤中讀取查詢需要的所有列,按照 order by 列在 sort_buffer 緩衝區對他們進行排序,然後掃描排序後的列表輸出。因爲單路排序效率更快,避免了二次讀取數據,把隨機IO變成了順序IO,但是會使用更多的空間。

但是單路排序算法可能會導致一個問題:如果數據量過大,一次讀取不完,就會導致讀取的次數比雙路排序多。

因爲讀取操作是在 sort_buffer 中,如果數據量過大,超出了 sort_buffer 的容量,導致每次只能讀取 sort_buffer 容量大小的數據進行排序,排完再取,導致多次IO。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章