下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

MySQL优化GROUP BY方案

作者:课课家教育     来源: http://www.kokojia.com点击数:1015发布时间: 2017-08-24 09:00:18

标签: 数据库MySQLGROUP BY语句

  满足GROUPBY子句的最一般的方法是扫描整个表并创建一个新的临时表,表中每个组的所有行应为连续的,然后使用该临时表来找到组并应用累积函数(如果有)。在某些情况中,MySQL能够做得更好,即通过索引访问而不用创建临时表。

  执行GROUPBY子句的最一般的方法:先扫描整个表,然后创建一个新的临时表,表中每个组的所有行应为连续的,最后使用该临时表来找到组并应用聚集函数(如果有聚集函数)。在某些情况中,MySQL通过访问索引就可以得到结果,而不用创建临时表。此类查询的EXPLAIN输出显示Extra列的值为Usingindexforgroup-by。

  一、松散索引扫描

  1.满足条件

  ①查询针对一个表。

  ②GROUPBY使用索引的最左前缀。

  ③只可以使用MIN()和MAX()聚集函数,并且它们均指向相同的列。

  2.示例

  表t1(c1,c2,c3,c4)有一个索引idx(c1,c2,c3):

  表t1(c1,c2,c3,c4)有一个索引idx(c1,c2,c3):

  不满足条件示例:

  1.除了MIN()或MAX(),还有其它累积函数,例如:

  SELECTc1,SUM(c2)FROMt1GROUPBYc1;

  2.GROUPBY子句中的域不引用索引开头,例如:

  SELECTc1,c2FROMt1GROUPBYc2,c3;

  3.查询引用了GROUPBY部分后面的关键字的一部分,并且没有等于常量的等式,例如:

  SELECTc1,c3FROMt1GROUPBYc1,c2;

  二、紧凑索引扫描

  如果不满足松散索引扫描条件,执行GROUPBY仍然可以不用创建临时表。如果WHERE子句中有范围条件,该方法只读取满足这些条件的关键字。

  否则,进行索引扫描。该方法读取由WHERE子句定义的范围。

  1.GROUPBY中有一个漏洞,但已经由条件c2='a'覆盖。

  SELECTc1,c2,c3FROMt1WHEREc2='a'GROUPBYc1,c3;

  2.GROUPBY不是满足最左前缀,但是有一个条件提供该元素的常量:

  SELECTc1,c2,c3FROMt1WHEREc1='a'GROUPBYc2,c3;

  默认情况下,MySQL排序所有GROUPBYcol1,col2,....,查询的方法如同在查询中指定ORDERBYcol1,col2,...。如果显式包括一个包含相同的列的ORDERBY子句,MySQL可以毫不减速地对它进行优化,尽管仍然进行排序。

  如果查询包括GROUPBY但你想要避免排序结果的消耗,你可以指定ORDERBYNULL禁止排序。例如:

  INSERTINTOfoo

  SELECTa,COUNT(*)FROMbarGROUPBYaORDERBYNULL;

  小编结语:

  更多内容尽在课课家教育!

赞(18)
踩(1)
分享到:
华为认证网络工程师 HCIE直播课视频教程