前言
大家好,我是捡田螺的小男孩。
日常开发中,我们经常会使用到group by
。亲爱的小伙伴,你是否知道group by
的工作原理呢?group by
和having
有什么区别呢?group by
的优化思路是怎样的呢?使用group by
有哪些需要注意的问题呢?本文将跟大家一起来学习,攻克group by
~
- 使用group by的简单例子
- group by 工作原理
- group by + where 和 group by + having的区别
- group by 优化思路
- group by 使用注意点
- 一个生产慢SQL如何优化
公众号:捡田螺的小男孩
1. 使用group by的简单例子
group by
一般用于分组统计,它表达的逻辑就是根据一定的规则,进行分组
。我们先从一个简单的例子,一起复习一下哈。
假设用一张员工表,表结构如下:
CREATE TABLE `staff` (
`id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`id_card` varchar(20) NOT NULL COMMENT '身份证号码',
`name` varchar(64) NOT NULL COMMENT '姓名',
`age` int(4) NOT NULL COMMENT '年龄',
`city` varchar(64) NOT NULL COMMENT '城市',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COMMENT='员工表';
复制代码
表存量的数据如下:
我们现在有这么一个需求:统计每个城市的员工数量。对应的 SQL 语句就可以这么写:
select city ,count(*) as num from staff group by city;
复制代码
执行结果如下:
这条SQL语句的逻辑很清楚啦,但是它的底层执行流程是怎样的呢?
2. group by 原理分析
2.1 explain 分析
我们先用explain
查看一下执行计划
explain select city ,count(*) as num from staff group by city;
复制代码
- Extra 这个字段的
Using temporary
表示在执行分组的时候使用了临时表 - Extra 这个字段的
Using filesort
表示使用了排序
group by
怎么就使用到临时表和排序
了呢?我们来看下这个SQL的执行流程
2.2 group by 的简单执行流程
explain select city ,count(*) as num from staff group by city;
复制代码
我们一起来看下这个SQL的执行流程哈
- 创建内存临时表,表里有两个字段
city
和num
; - 全表扫描
staff
的记录,依次取出city = 'X'的记录。