MySQL 之 filesort

MySQL filesort的理解

在對sql進行調優時候,經常碰到explain輸出using filesort,那麼這是什麼意思的

如果mysql在排序的時候沒有使用到索引那麼就會輸出using filesort。mysql對排序有兩種實現

兩邊掃描

第一遍掃描出需要排序的字段,然後進行排序後,根據排序結果,第二遍再掃描一下需要select的列數據。這回引起大量的隨即IO,效率不高,但是節約內存。排序使用quick sort。但是如果內存不夠則會按照block進行排序,將排序結果寫入磁盤文件,然後再將結果合併。

一遍掃描

即一遍掃描數據後將select需要的列數據以及排序的列數據都取出來,這樣就不需要進行第二遍掃描了,當然內存不足時也會使用磁盤臨時文件進行外排。

MySQL根據max_length_for_sort_data來判斷排序時使用一遍掃描還是兩遍掃描。如果需要的列數據一行可以放入max_length_for_sort_data則使用一遍掃描否則使用兩遍>掃描

MySQL根據sort_buffer_size來判斷是否使用磁盤臨時文件,如果需要排序的數據能放入sort_buffer_size則無需使用磁盤臨時文件,此時explain只會輸出using filesort 否則需要使用磁盤臨時文件explain會輸出using temporary;using filesort

總結

當看到MySQL的explain輸出using filesort不要太過緊張,這說明排序的時候沒有使用索引,如果輸出using temporary;using filesort則需要引起注意了,說明使了磁盤
臨時文件,效率會降低。一句話using filesort需要酌情優化。

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