在使用 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。