共計 1714 個字符,預計需要花費 5 分鐘才能閱讀完成。
本篇內容介紹了“mysql 中 filesort 指的是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓丸趣 TV 小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
在 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
這個 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 指的是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注丸趣 TV 網站,丸趣 TV 小編將為大家輸出更多高質量的實用文章!