group by的工作原理和优化思路

目录

引入

group by 原理分析

group by 的简单执行流程

临时表的排序是怎样的呢?

where 和 having的区别

where + having 区别总结

使用 group by 注意的问题

group by一定要配合聚合函数使用嘛?

group by 后面跟的字段一定要出现在select中吗?

group by导致的慢SQL问题

group by的一些优化方案

group by 后面的字段加索引

order by null 不用排序

尽量只使用内存临时表

使用SQL_BIG_RESULT优化


注意:本文参考  group by的工作原理和优化思路_Java技术债务的博客-CSDN博客

引入

日常开发中,我们经常会使用到group by。你是否知道group by的工作原理呢?group by和having有什么区别呢?group by的优化思路是怎样的呢?使用group by有哪些需要注意的问题呢?

使用group by的简单例子
group by 工作原理
group by + where 和 having的区别
group by 优化思路
group by 使用注意点
一个生产慢SQL如何优化
使用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语句的逻辑很清楚啦,但是它的底层执行流程是怎样的呢?

group by 原理分析

explain 分析

我们先用explain查看一下执行计划

 explain select city ,count(*) as num from staff group by city;

Extra 这个字段的Using temporary表示在执行分组的时候使用了临时表

Extra 这个字段的Using filesort表示使用了排序

group by 怎么就使用到临时表和排序了呢?我们来看下这个SQL的执行流程

group by 的简单执行流程

explain select city ,count(*) as num from staff group by city;

创建内存临时表,表里有两个字段city和num;

全表扫描staff的记录,依次取出city = 'X’的记录。

判断临时表中是否有为 city='X’的行,没有就插入一个记录 (X,1);

如果临时表中有city='X’的行的行,就将x 这一行的num值加 1;

遍历完成后,再根据字段city做排序,得到结果集返回给客户端。

这个流程的执行图如下:

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值