您好,登錄后才能下訂單哦!
本篇內容介紹了“mysql中filesort指的是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
在mysql中,filesort是指文件排序,是通過相應的排序算法,將取得的數據在內存中進行排序。filesort分兩種:1、雙路排序,是首先根據相應的條件取出相應的排序字段和可以直接定位行數據的行指針信息,然后在sort buffer 中進行排序;2、單路排序,是一次性取出滿足條件行的所有字段,然后在sort buffer中進行排序。
在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 并不是說通過磁盤文件進行排序,而只是告訴我們進行了一個排序操作。即在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中filesort指的是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。