看一遍就理解:group by 详解

本文详细解析了SQL中的`GROUP BY`语句,包括其工作原理、`WHERE`与`HAVING`的区别,以及优化策略。通过实例分析了`GROUP BY`在不同场景下的执行流程,并探讨了可能导致慢查询的因素,提供了如添加合适索引、避免排序等优化方法。
摘要由CSDN通过智能技术生成

前言

大家好,我是捡田螺的小男孩

日常开发中,我们经常会使用到group by。亲爱的小伙伴,你是否知道group by的工作原理呢?group byhaving有什么区别呢?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的执行流程哈

  1. 创建内存临时表,表里有两个字段citynum
  2. 全表扫描staff的记录,依次取出city = 'X'的记录。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值