MySQL group

194 阅读1分钟

目标:分组查询该怎么优化?

分析:

group.png

详解:

第一部分 group分析

一般一个SQL的执行顺序:

  • Using where:通过搜索可能的索引树定位到满足部分条件的,然后回表查找数据
  • Using temporary:使用临时表暂存分组及统计字段信息
  • Using filesort:使用sort_buffer对分组字段进行排序
1、Using where

选择合适的索引,读取数据到内存。

2、Using temporary 临时表

存储统计的结果的临时表,分为以下两种:

  • 内存临时表:临时表的大小小于tmp_table_size,使用内存存储
  • 磁盘临时表:临时表的大小大于tmp_table_size,使用磁盘存储
3、Using filesort

排序使用

第二部分 group优化

从第一部分我们知道,使用Using temporary跟Using filesort都会使效率下降,使用覆盖索引可以很好的解决这个问题。

第三部分 having

1、having 与 where
  • having:对临时表的结果过滤,不使用索引
  • where: 对原表数据进行过滤,可能使用索引

第四部分 参数

1、sql_mode : ONLY_FULL_GROUP_BY
  • 开启ONLY_FULL_GROUP_BY:不支持查询列表中包含非分组列
  • 关闭ONLY_FULL_GROUP_BY:支持查询列表中包含非分组列
2、WITH ROLLUP
SELECT coalesce(name, '总数'), SUM(score) as total_score FROM  students GROUP BY name WITH ROLLUP;

返回结果会多一行总计,就像我们在excel做报表时一样。