在mysql中,filesort是指檔案排序,是透過對應的排序演算法,將取得的資料在記憶體中進行排序。 filesort分成兩種:1、雙路排序,是首先根據對應的條件取出對應的排序欄位和可以直接定位行資料的行指標訊息,然後在sort buffer 中進行排序;2、單路排序,是一次性取出滿足條件行的所有字段,然後在sort buffer中進行排序。
本教學操作環境:windows7系統、mysql8版本、Dell G3電腦。
在MySQL中的ORDER BY有兩種排序實作方式:
1. 利用有序索引來取得有序資料
2. 文件排序(filesort)
在explain中分析查詢的時候,利用有序索引取得有序資料顯示Using index ,檔案排序顯示Using fileso#rt。
只有當ORDER BY中所有的欄位必須包含在相同的索引,並且索引的順序和order by子句中的順序完全一致,並且所有列的排序方向(升序或降序)一樣才有,(混合使用ASC模式和DESC模式則不使用索引)
#where語句與order by 語句組合滿足最左字首
#在其他的情況下使用檔案排序如下:
1) where語句與order by語句,使用了不同的索引
2) 檢查的行數過多,且沒有使用覆蓋索引
3) ORDER BY中的列不包含在相同的索引,也就是使用了不同的索引
4) 對索引列同時使用了ASC和DESC
# 5) where語句或ORDER BY語句中索引列使用了表達式,包括函數表達式
6) where 語句與ORDER BY語句組合滿足最左前綴,但where語句中找的是範圍。
這個 filesort 並不是說透過磁碟檔案進行排序,而只是告訴我們進行了一個排序操作。即在MySQL Query Optimizer 所給出的執行計劃(透過EXPLAIN 指令檢視)中稱為檔案排序(filesort)
檔案排序是透過對應的排序演算法,將取得的資料在記憶體中進行排序: MySQL需要將資料在記憶體中排序,所使用的記憶體區域也就是我們透過sort_buffer_size 系統變數所設定的排序區。這個排序區是每個Thread 獨享的,所以說可能在同一時刻在MySQL 中可能存在多個 sort buffer 記憶體區域。
filesort分兩種
雙路排序:是先根據對應的條件取出對應的排序欄位和可以直接定位行資料的行指標訊息,然後在sort buffer 中進行排序。排序後再吧查詢欄位依行指標取出,共執行兩次磁碟io。
單路排序:是一次取出滿足條件行的所有字段,然後在sort buffer中進行排序。執行一次磁碟io。
MySQL主要透過比較我們所設定的系統參數 max_length_for_sort_data的大小和Query 語句所取出的欄位類型大小總和來判定需要使用哪一種排序演算法。如果 max_length_for_sort_data較大,則使用第二種最佳化後的演算法,反而使用第一種演算法。所以如果希望 ORDER BY 操作的效率盡可能的高,一定要主義max_length_for_sort_data 參數的設定。曾經就有同事的資料庫出現大量的排序等待,造成系統負載很高,而且回應時間變得很長,最後查出正是因為MySQL 使用了傳統的第一種排序演算法而導致,在加大了max_length_for_sort_data參數值之後,系統負載馬上得到了大的緩解,反應也快了很多。
如果order by的子句只引用了聯結中的第一個表,MySQL會先對第一個表進行排序,然後進行聯結。也就是expain中的Extra的Using Filesort.否則MySQL先把結果保存到臨時表(Temporary Table),然後再對臨時表的資料進行排序.此時expain中的Extra的顯示Using temporary Using Filesort.
【相關推薦:mysql影片教學】
以上是mysql中什麼是filesort的詳細內容。更多資訊請關注PHP中文網其他相關文章!