mysql中什麼是filesort

2022-11-11 18:01:27

在mysql中,filesort是指檔案排序,是通過相應的排序演演算法,將取得的資料在記憶體中進行排序。filesort分兩種:1、雙路排序,是首先根據相應的條件取出相應的排序欄位和可以直接定位行資料的行指標資訊,然後在sort buffer 中進行排序;2、單路排序,是一次性取出滿足條件行的所有欄位,然後在sort buffer中進行排序。

程式設計師必備介面測試偵錯工具:

本教學操作環境:windows7系統、mysql8版本、Dell G3電腦。

在MySQL中的ORDER BY有兩種排序實現方式:

1. 利用有序索引獲取有序資料
2. 檔案排序(filesort)

在explain中分析查詢的時候,利用有序索引獲取有序資料顯示Using index ,檔案排序顯示 Using filesort。

只有當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

這個 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.

相關推薦:《Linux視訊教學

以上就是mysql中什麼是filesort的詳細內容,更多請關注TW511.COM其它相關文章!