2019年6月26日 星期三

【MYSQL】order by 和group by索引優化

order by

  • 1.order by 子句,盡量使用index方式排序,避免使用 filesort方式排序(即explain select...,查看Extra的欄位,using index 優於 using filesort)
  • 2.盡可能在索引列上完成排序操作,遵照索引的最佳左前綴
  • 3.如果不在索引列上,filesort會使用到sort_buffer的容量去進行排序,如果查詢的字段的總數據超出了sort_buffer的容量,就會導致每次只能取sort_buffer容量大小的數據,進行排序(創建tmp文件,再合併),排完後再次取sort_buffer容量大小,再排.....大量的I/O操作。解決:增大max_length_for_sort_data參數的設置+增大sort_buffer_size參數的設置
提高order by 的速度
  • order by 時 大忌是使用 select * 
  • 當query的字段大小總和小於 max_length_for_sort_data 而且排序字段不是TEXT | BLOB類型時,會用上列第三個算法排序
  • 當嘗試提高sort_buffer_size,此參數會提高效率,但實際還是要根據系統的能力去提高,因為此值針對每個進程的
  • 當嘗試提高max_length_for_sort_data,如果設太高,數據總容量會超出sort_buffer_size的概率就會增大,反而是提高硬碟I/O活動和降低處理器使用率

範例:order by為排序使用索引

MYSQL兩種排序方式:結果直接或結果字段使用到索引即產生有效排序
MYSQL能為排序與查詢使用相同的索引

key a_b_c(a,b,c)
order by 可以使用到索引最左前綴
-order by a
-order by a,b
-order by a,b,c
-order by a desc, b desc , c desc

如果where使用索引的最左前綴定義為常量(const),則order by 能使用索引
-where a = const order by b,c
-where a = const and b = const order by c
-where a = const order by b,c
-where a = const and b > const order by b,c

不能使用索引進行排序
-order by a asc, b desc , c desc  (因排序不一致)
-where f = const order by b,c  (a索引丟失)
-where a = const order by c  (b索引丟失)
-where a = const order by a,d  (d非索引)
-where a in (...)  order by b,c  (a = const order by a,d (d非索引)
-where a in (...) order by b,c (對於排序來說,多個相等條件也是範圍查詢)

group by 同order by

  • group by 是先排序後再進行分組,遵照索引建的最佳左前綴原則
  • 當無法使用索引列時,增大max_length_for_sort_data參數的設置+增大sort_buffer_size參數的設置
  • where 高於having,能寫在where限定的條件就不要去having限定了

沒有留言:

張貼留言