MySQL 原理優化之Group By的優化技巧

今天來看看MySQL 中如何多Group By 語句進行優化的。

先創建tb_user 表如下:

通過show index from tb_user; 命令查看表,沒有存在任何的索引。

執行如下代碼,查看SQL 執行情況

explain select profession, count(*) from tb_user group by profession ;

發現返回結果中 type 為“ALL” ,Extra 返回“Using temporary” 說明沒有使用索引。

於是,創建基於profession,age和status 的索引如下:

create index index_user_pro_age_sta on tb_user(profession ,age, status);

這裡創建索引從左到右的順序是 profession ,age, status。

此時再次執行SQL執行計劃如下:

explain select profession, count(*) from tb_user group by profession ;

發現使用瞭索引“index_user_pro_age_sta”。說明在執行 group by操作的時候,使用聯合索引是有效的。

接著在看使用如下代碼:

explain select age, count(*) from tb_user group by age;

SQL 語句使用age 進行group by,查看explain的結果如下:

在Extra 字段中發現使用瞭“Using temporary”,說明沒有走索引,是因為沒有滿足索引的最左前綴法則

聯合索引 index_user_pro_age_sta的順序從左到右分別是 profession ,age, status。

上面的SQL 語句Group by 後面接著的是age ,因此出現“Using temporary”。

這裡對SQL 進行修改。如下:

explain select profession,age, count(*) from tb_user group by profession, age;

由於group by 後面跟著profession, age ,符合聯合索引的創建順序,因此索引生效。

我們再來試試再加入過濾條件的情況,加入profession = 軟件工程,此時group by 裡面隻顯示 age,那麼此時是否會走索引, 答案是 using index。因為滿足瞭最左前綴法則。

explain select age, count(*) from tb_user where profession = '軟件工程' group by age;

總結一下:

SQL在分組操作的時候,可以通過索引來提高效率。做分組操作的時候,索引的使用需要滿足最左前綴法則。

到此這篇關於MySQL 原理優化之Group By的優化技巧的文章就介紹到這瞭,更多相關MySQLGroup By優化內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: