目标:分组查询该怎么优化?
分析:
详解:
第一部分 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做报表时一样。