mysql中的文件排序(filesort)


在MySQL中的ORDER BY有兩種排序實現方式: 
1. 利用有序索引獲取有序數據 
2. 文件排序

在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.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM