MySQL優化GROUP BY計劃。本站提示廣大學習愛好者:(MySQL優化GROUP BY計劃)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL優化GROUP BY計劃正文
履行GROUP BY子句的最普通的辦法:先掃描全部表,然後創立一個新的暫時表,表中每一個組的一切行應為持續的,最初應用該暫時表來找到組並運用集合函數(假如有集合函數)。在某些情形中,MySQL經由過程拜訪索引便可以獲得成果,而不消創立暫時表。此類查詢的 EXPLAIN 輸入顯示 Extra列的值為 Using index for group-by。
一。 松懈索引掃描
1.知足前提
查詢針對一個表。
GROUP BY 應用索引的最左前綴。
只可使用MIN()和MAX()集合函數,而且它們均指向雷同的列。
2.示例
表t1(c1,c2,c3,c4) 有一個索引 idx(c1,c2,c3):
SELECT c1, c2 FROM t1 GROUP BY c1, c2; SELECT DISTINCT c1, c2 FROM t1; SELECT c1, MIN(c2) FROM t1 GROUP BY c1; SELECT c1, c2 FROM t1 WHERE c1 < const GROUP BY c1, c2; SELECT MAX(c3), MIN(c3), c1, c2 FROM t1 WHERE c2 > const GROUP BY c1, c2; SELECT c2 FROM t1 WHERE c1 < const GROUP BY c1, c2; SELECT c1, c2 FROM t1 WHERE c3 = const GROUP BY c1, c2;
不知足前提示例:
1. 除MIN()或MAX(),還有其它積累函數,例如:
SELECT c1, SUM(c2) FROM t1 GROUP BY c1;
2. GROUP BY子句中的域不援用索引開首,例如:
SELECT c1,c2 FROM t1 GROUP BY c2, c3;
3. 查詢援用了GROUP BY 部門前面的症結字的一部門,而且沒有等於常量的等式,例如:
SELECT c1,c3 FROM t1 GROUP BY c1, c2;
二。緊湊索引掃描
假如不知足松懈索引掃描前提,履行GROUP BY依然可以不消創立暫時表。假如WHERE子句中有規模前提,該辦法只讀取知足這些前提的症結字。
不然,停止索引掃描。該辦法讀取由WHERE子句界說的規模。
1. GROUP BY 中有一個破綻,但曾經由前提c2 = 'a'籠罩。
SELECT c1,c2,c3 FROM t1 WHERE c2 = 'a' GROUP BY c1,c3;
2. GROUP BY 不是知足最左前綴,然則有一個前提供給該元素的常量:
SELECT c1,c2,c3 FROM t1 WHERE c1 = 'a' GROUP BY c2,c3;