InnoDB引擎之Order By排序優化

InnoDB引擎有兩種排序方式

  1. 對返回的數據進行排序,ExplainExtra列顯示using filesort,所有不是通過索引直接返回排序結果的排序都稱爲Filesort
  2. 通過有序索引順序掃描直接返回有序數據,ExplainExtra列顯示using index

MySQL優化排序的思路:儘量減少額外的排序,或者通過有序索引直接返回有序數據。通常情況下,where條件和order by使用相同的索引,並且order by後面的索引要和索引定義的順序保持一致,而且要保證多字段排序都是正序或倒序,否則就會出現Filesort

Filesort的兩種排序算法

  1. 兩次掃描算法
    MySQL4.1之前,默認使用這種方式。大致流程:首先根據條件取出排序字段和行指針信息,然後在排序區sort buffer中排序,如果sort buffer大小不夠,將排序結果放入temporary table中,完成排序後,根據行指針回表查詢數據。這算法可能會有大量的IO操作,效率低。

  2. 一次掃描算法
    一次性將滿足條件的所有字段放入sort buffer中排序,內存開銷大,但排序效率比兩次掃描要高。

注意區分加粗的字,排序字段和行指針信息所有字段 這算是兩種算法的核心。

Filesort 無法避免時的處理方式

MySQL通過比較系統變量max_length_for_sort_data的大小和Query取出的字段總大小來判斷用哪種算法排序,如果max_length_for_sort_data足以放下所有字段,那麼使用一次掃描算法。我們可以適當增大max_length_for_sort_datasort_buffer_size系統變量擴大排序區的大小,提高排序效率。

查看大小
show variables like 'max_length_for_sort_data';
show variables like 'sort_buffer_size';

設置當前連接的大小
set max_length_for_sort_data = 2048;
set sort_buffer_size = 2097152;
設置全局大小
set global max_length_for_sort_data = 2048;
set global  sort_buffer_size = 2097152;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章