视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
MySQL优化GROUPBY方案
2020-11-09 21:02:05 责编:小采
文档


执行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;

您可能感兴趣的文章:

  • MySQL5.7 group by新特性报错1055的解决办法
  • 解决MySQL 5.7.9版本sql_mode=only_full_group_by问题
  • MySQL高级查询之与Group By集合使用介绍
  • mysql中group by与having合用注意事项分享
  • mysql筛选GROUP BY多个字段组合时的用法分享
  • 深入解析mysql中order by与group by的顺序问题
  • mysql获取group by总记录行数的方法
  • Mysql升级到5.7后遇到的group by查询问题解决
  • 下载本文
    显示全文
    专题