標籤:超出 取資料 分享圖片 技術 HERE 掃描 指標 順序 SQ
order By 關鍵字最佳化1.盡量使用index方式排序,避免使用Filesort方式排序。2.Mysql支援兩種排序方式,Filesort和Index,Index效率高,它指Mysql掃描索引本身完成排序。FileSort排序方式效率低。
order by滿足兩種情況,會使用index排序1.order by 語句使用索引最左前列2.使用where子句和order By子句條件滿足索引最左前列。
如果不在索引列上,filesort有兩種演算法:Mysql就要啟動雙路排序和單路排序Mysql4.1之前使用雙路排序,字面意思就是兩次掃描磁碟,最終得到資料,讀取行指標和orderby列,對他們進行排序。然後掃描已經排好序的列表,按照列表中的值重新從列表中讀取對應的資料。單路排序:從磁碟讀取要查詢的列,按照order by列在buffer對他們進行排序,然後掃描排序後的列表進行輸出,它的效率更快一些,避免了第二次讀取資料。並且把隨機IO變成了順序IO,但是他會使用更多的空間,因為他把每一行都儲存在記憶體中了。單路查詢問題:在sort_buffer中,在使用單路查詢時,因為要把所有欄位都取出,所以有可能取出的資料的總大小超出了sort_buffer的容量,導致每次只能去sort_buffer容量大小的資料,進行排序,排完在取出sort_buffer容量大小,造成多次I/O。
最佳化策略:增大sort_buffer_size參數的設定增大max_length_forsort_data參數的設定
group by 實質是先排序後進行分組,遵照索引建的最佳左首碼。當無法使用索引列增大sort_buffer_size參數的設定和max_length_forsort_data參數的設定Where高於having,能寫在where限定的條件就不要去having限定了。
Mysql之order by|group by 排序最佳化