MySQL?原理優(yōu)化之Group?By的優(yōu)化技巧
今天來(lái)看看MySQL 中如何多Group By 語(yǔ)句進(jìn)行優(yōu)化的。
先創(chuàng)建tb_user 表如下:

通過(guò)show index from tb_user; 命令查看表,沒(méi)有存在任何的索引。

執(zhí)行如下代碼,查看SQL 執(zhí)行情況
explain select profession, count(*) from tb_user group by profession ;

發(fā)現(xiàn)返回結(jié)果中 type 為“ALL” ,Extra 返回“Using temporary” 說(shuō)明沒(méi)有使用索引。
于是,創(chuàng)建基于profession,age和status 的索引如下:
create index index_user_pro_age_sta on tb_user(profession ,age, status);
這里創(chuàng)建索引從左到右的順序是 profession ,age, status。
此時(shí)再次執(zhí)行SQL執(zhí)行計(jì)劃如下:
explain select profession, count(*) from tb_user group by profession ;

發(fā)現(xiàn)使用了索引“index_user_pro_age_sta”。說(shuō)明在執(zhí)行 group by操作的時(shí)候,使用聯(lián)合索引是有效的。
接著在看使用如下代碼:
explain select age, count(*) from tb_user group by age;
SQL 語(yǔ)句使用age 進(jìn)行g(shù)roup by,查看explain的結(jié)果如下:

在Extra 字段中發(fā)現(xiàn)使用了“Using temporary”,說(shuō)明沒(méi)有走索引,是因?yàn)闆](méi)有滿足索引的最左前綴法則。
聯(lián)合索引 index_user_pro_age_sta的順序從左到右分別是 profession ,age, status。
上面的SQL 語(yǔ)句Group by 后面接著的是age ,因此出現(xiàn)“Using temporary”。
這里對(duì)SQL 進(jìn)行修改。如下:
explain select profession,age, count(*) from tb_user group by profession, age;

由于group by 后面跟著profession, age ,符合聯(lián)合索引的創(chuàng)建順序,因此索引生效。
我們?cè)賮?lái)試試再加入過(guò)濾條件的情況,加入profession = 軟件工程,此時(shí)group by 里面只顯示 age,那么此時(shí)是否會(huì)走索引, 答案是 using index。因?yàn)闈M足了最左前綴法則。
explain select age, count(*) from tb_user where profession = '軟件工程' group by age;

總結(jié)一下:
SQL在分組操作的時(shí)候,可以通過(guò)索引來(lái)提高效率。做分組操作的時(shí)候,索引的使用需要滿足最左前綴法則。
到此這篇關(guān)于MySQL 原理優(yōu)化之Group By的優(yōu)化技巧的文章就介紹到這了,更多相關(guān)MySQLGroup By優(yōu)化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Windows系統(tǒng)中配置開(kāi)啟MySQL數(shù)據(jù)庫(kù)日志的完整步驟
這篇文章主要給大家介紹了關(guān)于Windows系統(tǒng)中配置開(kāi)啟MySQL數(shù)據(jù)庫(kù)日志的完整步驟,大家要開(kāi)啟MySQL數(shù)據(jù)庫(kù)的日志功能,可以按照本文介紹的步驟進(jìn)行操作,需要的朋友可以參考下2023-09-09
mysql innodb的監(jiān)控(系統(tǒng)層,數(shù)據(jù)庫(kù)層)
這篇文章主要介紹了mysql innodb的監(jiān)控(系統(tǒng)層,數(shù)據(jù)庫(kù)層)的相關(guān)資料,需要的朋友可以參考下2017-04-04
MySql字符串拆分實(shí)現(xiàn)split功能(字段分割轉(zhuǎn)列)
本文主要介紹了MySql字符串拆分實(shí)現(xiàn)split功能(字段分割轉(zhuǎn)列),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
mysql插入中文數(shù)據(jù)變成問(wèn)號(hào)的解決方案
這篇文章主要介紹了mysql插入中文數(shù)據(jù)變成問(wèn)號(hào)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
給Mysql添加遠(yuǎn)程訪問(wèn)權(quán)限的方法
這篇文章主要介紹了給Mysql添加遠(yuǎn)程訪問(wèn)權(quán)限的方法的相關(guān)資料,需要的朋友可以參考下2015-03-03
mysql 10w級(jí)別的mysql數(shù)據(jù)插入
幾天前做了一個(gè)短信發(fā)送東東,一次性要插入10w以上的手機(jī)號(hào)碼。我的個(gè)天啊。2011-08-08

