一.提高order by 的速度:
1.查詢時使用order by 的列儘量使用索引,避免出現fileSort;
2.order by 時 select * 是一個大忌,只取query需要的字段,這點非常重要,在這裏影響的是:
- 當query 字段大小總和小於 max_length_for_sort_data 而且排序字段不是TEXT或BLOB類型時,會用改進後的算法:單路排序;否則用老算法:多路排序。
- 兩種算法的數據都有可能超出sort_buffer 的容量,超出之後,會創建tmp文件進行合併排序,導致多次I/O,但是單路排序的算法風險會更大一些,所以要提高sort_buffer_size.3.嘗試提高sort_buffer_size
不管用哪種算法,提高這個參數都會提高效率,當然,要根據系統的能力去提高,因爲這個參數是針對每個進程的。
3.嘗試提高 max_length_for_sort_data
- 提高這個參數,會增加用改進算法的概率,但是如果設置的太高,數據總容量超出sort_buffer_size 的概率就會增大,明顯症狀是高的磁盤I/O活動和低的處理器使用率。
4.爲排序使用索引:
- Mysql 兩種排序方式:文件排序(fileSort)和掃描有序索引排序(using index);
- Mysql 能爲排序與查詢使用相同的索引;
- KEY a_b_c(a,b,c)
5.Order by 能使用最左前綴
……order by a
……order by a,b
……order by a,b,c
……order by a desc,b desc,c desc
如果where 使用索引的最左前綴定義爲常量,則order by 能使用索引:
……. Where a=’20’ order by b,c
……. Where a=’20’ and b=’44’ order by c
……. Where a=’20’ and b> 60 order by b,c
不能使用索引進行排序:
…….. Order by a asc,b desc ,c desc –排序不一致
…….. Where h=’sa’ Order by b desc,c desc –丟失a索引
…….. Where a=’20’ order by c desc –丟失b索引
…….. Where a=’20’ order by a ,d —- d不是索引的一部分
…….. Where a in(…) order by b,c — 對於排序來說,多個相等條件也是範圍查詢
二. Mysql Group by 優化
優化原則:
Group by 的優化方式同 order by 的優化,區別在於 group by 是先排序後分組,遵照索引建的最佳左前綴;
當無法使用索引列時,增大max_length_for_sort_data 參數的設置+ 增大sort_buffer_size 參數的設置;
Where 高於 having,能寫在 where 限定的條件就不要去having 限定了。