group by 是怎样工作的

深入理解MySQL中的ONLY_FULL_GROUP_BY 阅读详情

数据准备

CREATE TABLE `t2` (
  `id` int(11) NOT NULL,
  `a` int(11) DEFAULT NULL,
  `b` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `index_a` (`a`)
) ENGINE=InnoDB;

在表 t2 中插入数据 100 条数据
for(int i=1; i<=100; i++) {
    insert into t2(id, a, b) values(i, i, i);
}

group by 执行流程

sql select b, count(*) as count from t2 group by b;

1:创建临时表,表里有两个字段 b 和 count,主键是 b

2:对表 t2 进行全表扫描,依次取出每条记录的字段 b(该步骤会扫描临时表的主键来定位记录)

  • 如果临时表中没有主键为 b 的行,就插入一个记录 (b,1)
  • 如果表中有主键为 b 的行,就将 b 这一行的 count字段对应的值加 1

3:遍历完成后,再根据字段 b 做排序(参考 order by 是怎样工作的),得到结果集返回给客户端

这里说明一下,通过查看慢日志,sql的实际扫描行数是300行,为什么是300行。

  • 首先对t2进行全表扫描,这就是100行
  • 在扫描临时表主键的时候,每次会扫描 1 行,会扫描 100次,这就是 100行(扫描100次是,因为 t2 表有 100条记录)
  • 步骤3,要对临时表根据字段 b 做排序(这里假设 sort buffer 足够大,并且使用的是全字段排序),所以对临时表进行一次全表扫描,临时表的记录条数100,这就是 100 行。

在sql语句后面添加 order by null 可以避免步骤 3 的排序工作

select b, count(*) as count from t2 group by b order by null;

扫描行数为 200 行

使用 group by 为什么需要创建临时表。

group by 的语义逻辑,是统计不同的值出现的个数。但是,由于每一行字段 b 的值不一样,所以我们就需要有一个临时表,来记录并统计结果。

group by 如何优化

方式1:加索引

索引天然就保证了数据的有序性,所以执行 group by 的时候也就不需要创建临时表来记录并统计结果。

select b, count(*) as count from t2 group by b; 字段 b 是索引,sql的执行流程就是下面这样

  • 当碰到第一个 2 的时候,已经知道累积了 X 个 1,结果集里的第一行就是 (1, X);
  • 当碰到第一个 3 的时候,已经知道累积了 Y 个 2,结果集里的第二行就是 (2, Y);

通过对比,有索引的 group by,和没索引的 group by 两者的执行过程,就可以发现,有索引的group by只需要扫描索引就可以了。而没索引的 group by

还需要维护临时表(临时表可能是内存临时表【memory引擎】或者磁盘临时表【innodb引擎】),还需要进行 order by 排序

方式2:直接排序

如果可以通过加索引来完成 group by 逻辑就再好不过了。但是,如果碰上不适合创建索引的场景,那就只能使用创建临时表。如果再碰上结果集数量大的情况,那性能就更糟糕了

那么,这时候的 group by 要怎么优化呢?可以在sql语句中加上 SQL_BIG_RESULT

select SQL_BIG_RESULT b, count(*) as count from t2 group by b;

sql的执行流程就变成这样了

  1. 初始化 sort_buffer,确定放入一个整型字段,记为 m;
  2. 扫描表 t1 依次取出里面的 字段 b 的值存入 sort_buffer 中;
  3. 扫描完成后,对 sort_buffer 的字段 m 做排序(如果 sort_buffer 内存不够用,就会利用磁盘临时文件辅助排序);
  4. 排序完成后,就得到了一个有序数组。
  5. 然后对有序数组做如下判断
  • 当碰到第一个 2 的时候,已经知道累积了 X 个 1,结果集里的第一行就是 (1, X);
  • 当碰到第一个 3 的时候,已经知道累积了 Y 个 2,结果集里的第二行就是 (2, Y);

Window系统下搭建GIT本地服务器 这是一篇在window下搭建git本地服务器的教程,带你一步步搭建出本地的git服务器。 阅读详情

相关推荐

保姆级教程:用Smaart7和你的USB声卡搞定现场音响系统调试(附频谱与延时测试避坑指南)

本文提供Smaart7与USB声卡协同工作的现场音响系统调试指南,涵盖硬件连接、频谱分析、延时校准等关键步骤。通过详细的操作流程和常见问题解决方案,帮助音响工程师快速掌握专业测量技术,确保演出音质达到最佳状态。

weixin_29290259的博客 424

深度整理总结MySQL——Group By的工作原理

group by 是用来对数据进行分组的,一般与聚合函数一起使用,对分组后的数据进行聚合。但由于GROUP BY 实际上也同样会进行排序操作,而且与ORDER BY 相比,GROUP BY 主要只是多了排序之后的分组操作。所以,在GROUP BY 的实现过程中,与 ORDER BY 一样也可以利用到索引。如果对 group by 语句的结果没有排序要求,要在语句后面加 order by null;

左灯右行的爱情 1400

台达B3伺服电机485通讯的调试过程

最近上了一项目,没办法直接把B3伺服接到PLC上去,怎么办?偶说试下直接电脑通过100多米的485线控制好了,定型前的测试就这样展开了。 1、焊CN1口 如果不安装CN1,是开不了机的,要报很多错误,比如SERV EMG ALERT, 上限报警,下限报警什么的,怎么办?直接焊好CN1头子吧,烦了点,但是必要的。 主要接的是11,9,10,32,31,30几个脚,按照图上连接好就是了。 2、 接线路 按照上面的图,接上伺服电机线,编码器线,电源线,包括限位常闭开关、485连线等,就完..

shidong01的博客 1万+

看一遍就理解:group by详解

having子句用于分组后筛选,where子句用于行条件筛选having一般都是配合group by和聚合函数一起出现如(where条件子句中不能使用聚集函数,而having子句就可以。having只能用在group by之后,where执行在group by之前。

weixin_45017098的博客 3200

别再到处找DEM了!手把手教你免费下载90米、30米、12.5米全球高程数据(附国内网盘链接)

本文详细介绍了如何免费获取全球90米(SRTM3)、30米(ASTER GDEM)和12.5米(ALOS)高精度DEM数据,并提供了国内网盘链接以绕过国际平台访问障碍。通过对比不同数据源的特点和适用场景,帮助用户根据项目需求选择最合适的DEM数据,同时分享了数据处理和质量提升的实用技巧,实现从数据获取到应用的无缝衔接。

weixin_28725949的博客 674

怎么调用onenet平台的API从而读取我们的设备数据和下发命令,做到控制开关

怎么调用onenet平台的API从而读取我们的设备数据和下发命令,做到控制开关 1、首先是怎么读取数据 读取的API是:http://api.heclouds.com/devices/datapoints?devIds=629063002 其中devids这个指的是你的设备ID 然后在我们的headers里面添加一些必要参数,就可以调用了 其中api-key的是你产品里面的master-apikey 把我们的参数写好就可以调用了,选择get方式,点击发送 这个value就是我们需要获取到的参数值了,

zyh960的博客 2万+

看一遍就理解:数据库group by详解

前言 大家好,我是程序员小灰。日常开发中,我们经常会使用到group by。亲爱的小伙伴,你是否知道group by的工作原理呢?group by和having有什么区别呢?group by的优化思路是怎样的呢?使用group by有哪些需要注意的问题呢?本文将跟大家一起来学习,攻克group by~使用group by的简单例子group by 工作原理group by + where 和 ha...

程序员小灰的博客 9500

Python 爬虫实战:爬取股票数据做 K 线图可视化

摘要:本文介绍基于Python的股票数据爬取与K线图可视化全流程技术方案。通过Requests库抓取东方财富网股票数据,使用Pandas进行清洗处理,并利用mplfinance库实现专业K线图绘制。文章详细讲解了数据爬取接口分析、反爬策略配置、K线图绘制方法(包含基础K线图和带均线的进阶版本),以及核心统计指标计算。该方案可应用于股票价格趋势分析,为投资决策提供数据支持,同时强调了数据使用的合规性和技术优化方向。

2503_91057718的博客 2050

SQL语句 group by 的用法详解

SQL语句 group by 的用法详解

weixin_50737119的博客 1771

【YOLO26保姆级零踩坑教程】环境搭建+五大任务快速入门,一行代码实现检测/分割/姿态/OBB/分类(Win+Linux全适配)

YOLO26环境搭建与实战指南:零踩坑全适配 本文是YOLO26全栈技术专栏的入门篇,提供Windows/Linux双系统的纯实战环境搭建指南,主打零踩坑、全适配。YOLO26基于Ultralytics框架优化,无需编译源码或手动下载权重,原生支持多任务推理。 环境配置关键点: 必须安装Ultralytics 8.4.0及以上版本 支持CPU/GPU环境,推荐Python 3.8-3.11 提供清华源配置解决下载慢问题 安装步骤: CPU版:一键安装Ultralytics和OpenCV GPU版:匹配CUD

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 776

基于ESP32的智能厨房控制系统开发

随着智能家居技术的发展,越来越多的家庭开始将传统的厨房设备进行智能化改造,以提高烹饪效率和生活质量。智能厨房控制系统是物联网(IoT)应用的重要组成部分,它将家居设备、传感器和网络结合起来,提供便捷的控制与监测功能,使厨房的烹饪过程更加智能、便捷和安全。基于ESP32的智能厨房控制系统不仅能够实现远程控制和监控,还能实现温度、湿度、烹饪状态的实时反馈,甚至具备智能化的推荐和自动化控制能力。ESP32是一款功能强大、集成度高的嵌入式开发平台,具有Wi-Fi和蓝牙双模通信能力,广泛应用于物联网设备的开发。

2201_76125393的博客 658

group by 执行顺序

所有结论都需要反复测试!如果有错误欢迎指正!一起努力! 如果喜欢的话,请点个赞吧就算鼓励我一下!

努力成为DBA的小王博客 1341

题解:洛谷 P14357 [CSP-J 2025] 拼数

等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。小 R 想知道,在他所有能拼成的正整数中,最大的是多少。你需要帮助小 R 求出他能拼成的正整数的最大值。小 X 给了小 R 一个字符串。输出一行一个正整数,表示小 R 能拼成的正整数的最大值。中的任意多个数字,按任意顺序拼成一个正整数。,表示小 X 给小 R 的字符串。#普及-# #其他排序#洛谷:[P14357。

团爸讲算法 1398

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

引入 日常开发中,我们经常会使用到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一般用于分组统计,它表达的逻辑就是根据

致力于不留技术债务cuizb.top 5052

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

你知道group by的工作原理和优化思路吗?

前言 日常开发中,我们经常会使用到group by。亲爱的小伙伴,你是否知道group by的工作原理呢?group by和having有什么区别呢?group by的优化思路是怎样的呢?...

磊哥聊Java 1425

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

MySql中group by语句工作原理和使用

MySql中group by语句工作原理和使用

qq_55019098的博客 520

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【工作问题】Mysql的Group By查询报错问题

Mysql的Group By查询报错问题 最近用FineReport弄了几个报表,原先在测试数据库环境下跑的溜溜的,结果一切到正式数据库,报错了: ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.user.user_id' which is not functionally dependent on columns in

ccystewart的博客 414

mysql left join group by,MySQL LEFT JOIN,GROUP BY和ORDER BY无法按要求工作

I have a table'products' => ('product_id', 'name', 'description')and a table'product_price' => ('product_price_id', 'product_id', 'price', 'date_updated')I want to perform a query something like...

weixin_29224589的博客 264

by group 累加中文字段_在工作中常用到的SQL

前言 只有光头才能变强。 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y最近在公司做了几张报表,还记得刚开始要做报表的时候都快把SQL给忘光了(当时在广州休假了1个月多,在实习期间也没咋写过SQL),回到公司的第一个需求就是做报表。于是我很不要脸地跟带我的学长说:“SQL我好像忘光了,group 分组查询好像都忘得差不多了,...

weixin_35456296的博客 380

【工作精华】注意group by

在做G1402报表的时候,会对集团号、集团名称做下面的默认, 如果集团名称为空就任意取改集团下面任意一个客户的名称,其实问题就出在这里。 因为现在华商银行的数据存在这样的状况,就是集团号不为空,而集团名称为空。 如果该集团下面有多个客户的话,那么就会存在一个集团号对应多个集团名称了,这样以来分组所得出的结果就不对了 。 所以这时候我们需要对集团名称做一个下面的处理,MAX(

专注于数据 1030

mysql group实例_mysql group by having 实例代码

mysql group by having 实例注意:使用group by的时候,SELECT子句中的列名必须为分组列。 如下实例必须包括name列名,因为name是作为group by分组的条件。实例:我的数据库中有一张员工工作记录表,表中的数据库如下: mysql> SELECT * FROM employee_tbl;+------+------+------------+------...

weixin_42509888的博客 88

mysql group子句_简单介绍MySQL中GROUP BY子句的使用

可以使用GROUP BY组值一列,并且如果愿意的话,可以将该列进行计算。使用COUNT,SUM,AVG等功能的分组列。要了解GROUP BY子句考虑的EMPLOYEE_TBL的的表具有以下记录:mysql> SELECT * FROM employee_tbl;+------+------+------------+--------------------+| id | name | wo...

weixin_39935654的博客 75

sql语法--分类汇总group by having

(一)group by having 使用场景 group by having 实现对数据的分类汇总,因此 group by 主要和统计类型计算函数一起使用,例如:count(),sum()等,而 having 是对我们统计的结果集再进行筛选,得到我们最后需要得到的数据集。不需要对统计的结果集 having 不则需要使用。 -- 按照员工编号统计员工在9月份的总工时、最长工作时间和工作天数 -- 然后筛选出总工时《176小时的员工 select d.userId 员工编号,

黎子爱发呆博客 1187

工作总结--group by与order

一、group by 1、group by 可以将查询结果按照某个字段或多个字段进行分组。字段中值相等的为一组。 2、group by可以和GROUP_CONCAT()函数一起使用。GROUP_CONCAT()函数会把每个分组中指定的字段值都显示出来。 3、group by通常与集合函数一起使用。     ① COUNT()函数:用于统计记录的条数。     ② SUM()函数:用于计算

Amy的博客 350

Oracle高级查询之GROUP BY

转自:http://blog.youkuaiyun.com/cunxiyuan108/article/details/21951377 为了方便大家学习和测试,所有的例子都是在Oracle自带用户Scott下建立的。 现在客户的需求是统计部门中每种工作的工资总额,最后还需要统计所有人的工资总数,相信这样的需求对大家来说还是比较简单的,很快就能写出SQL语句,如下: [sql] vie

zhanzhibo的专栏 466

mongoid 做sum和group by工作

参考了:http://www.dixis.com/?p=531 http://mongoid.org/docs/querying/criteria.html   在网站的日常管理中,我们经常需要统计网站数据,比如每天的注册人数,每天上线人数,每天发贴人数,每天帖子数目 所以我们也就经常写些这样的语句: Post.count :all, :conditions =&gt; ["c...

张大贝的blog 461
上一篇: order by 是怎样工作的
下一篇: join 是怎样工作的
三易的博客
博客等级 码龄15年 42粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值