輕鬆優化MySQL-之Join、group by語句的優化
Join語句的優化
-
儘可能減少Join語句中Nested Loop的迴圈總次數
最有效的辦法是讓驅動表的結果集儘可能地小,“永遠用小結果集驅動大結果集”。
比如,當兩個表(表A和表B)Join時,如果表A通過WHERE條件過濾後有10條記錄,而表B有20條記錄。如果選擇表A作為驅動表,也就是被驅動表的結果集為20,那麼我們通過Join條件對被驅動表(表B)的比較過濾就會進行10次。反之,如果選擇表B作為驅動表,則須要進行20次對錶A的比較過濾。
-
優先優化Nested Loop的內層迴圈
不僅在資料庫的Join中應該這樣做,實際上在優化程式語言時也有類似的優化原則。內層迴圈是迴圈中執行次數最多的,每次迴圈節約很少的資源,就能在整個迴圈中節約很多的資源
-
保證Join語句中被驅動表的Join條件欄位已經被索引
其目的正是基於上面兩點的考慮,只有讓被驅動表的Join條件欄位被索引了,才能保證迴圈中每次查詢都能夠消耗較少的資源,這也正是內層迴圈的實際優化方法
-
不要太吝惜Join Buffer的設定
當無法保證被驅動表的Join條件欄位被索引且記憶體資源充足時,不要太吝惜Join Buffer的設定。在Join是All、Index、range或index_merge型別的特殊情況下,Join Buffer才能派上用場。在這種情況下,Join Buffer的大小將對整個Join語句的消耗起到非常關鍵的作用
GROUP BY關鍵字優化
- group by 實質是先排序後分組,遵照索引的最佳左字首。
- 當無法使用索引列,增大max_length_for_sort_data引數的設定+增大sort_buffer_size引數的設定
- where 高於having,能寫在where限定的條件就不要去having去限定了。