- 論壇徽章:
- 0
|
GROUP BY算法: 有3種,
a). 使用臨時表。創(chuàng)建臨時表,放入要group by的數(shù)據(jù),按照group by的字段進行排序,生成group by結(jié)果集以及計算聚合函數(shù)的結(jié)果
b). Loose Index Scan
使用條件是針對單表的查詢;group by的字段按照順序前導(dǎo)匹配某個索引;索引必須是有序的;聚合函數(shù)只包含min、max,字段必須相同并且在索引中,并且是索引中緊跟著group by字段的下一個字段;索引字段中除了group by的字段外,其他字段如果出現(xiàn)在where條件中,where條件只能是常量值。MySQL 5.4.4加入了幾個新的聚合函數(shù):AVG(DISTINCT), SUM(DISTINCT), 和COUNT(DISTINCT),也是有限制性的
這種方式只需要部分掃描索引即可完成group by操作,如果where子句中只有g(shù)roup by字段的條件,則索引掃描的層級只需要到group by包含的字段(如果索引除了group by字段之外還包含其他字段,這種處理方式根本不需要掃描到索引頁節(jié)點等層級)。正因為索引中包含的信息有限,因此該算法對聚合函數(shù)、索引的要求非常多,適用的場景比較窄,但是效率是最高的
例如表t1(c1,c2,c3,c4),有索引idx(c1,c2,c3),下面語句可以使用Loose Index Scan:
SELECT c1, c2 FROM t1 GROUP BY c1, c2;
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;c). Tight Index Scan
其實就是利用有序索引的特性,避免創(chuàng)建臨時表以及額外的排序操作,因此前提條件是能夠利用有序索引;僅通過索引掃描可以完成查詢
例如表t1(c1,c2,c3,c4),有索引idx(c1,c2,c3),下面2個語句都可以使用Tight Index Scan進行g(shù)roup by:
SELECT c1, c2, c3 FROM t1 WHERE c2 = 'a' GROUP BY c1, c3;
SELECT c1, c2, c3 FROM t1 WHERE c1 = 'a' GROUP BY c2, c3;
在EXPLAIN中,Extra中出現(xiàn)Using index for group-by表示使用Loose Index Scan實現(xiàn);Using Temporary表示使用臨時表實現(xiàn);否則表示使用Tight Index Scan實現(xiàn)
本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u3/111930/showart_2185294.html |
|