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限定了。