Mysql的order by和group by性能優化

一.提高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 限定了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章