当前位置: 首页 > news >正文

group by 查询慢的话,如何优化?

1、说明

根据一定的规则,进行分组。

group by可能会慢在哪里?因为它既用到临时表,又默认用到排序。有时候还可能用到磁盘临时表。

  • 如果执行过程中,会发现内存临时表大小到达了上限(控制这个上限的参数就是tmp_table_size),会把内存临时表转成磁盘临时表。
  • 如果数据量很大,很可能这个查询需要的磁盘临时表,就会占用大量的磁盘空间。

2、如何优化group by呢?

  • group by 后面的字段加索引
  • order by null 不用排序
  • 尽量只使用内存临时表
  • 使用SQL_BIG_RESULT

3、 使用group by的简单例子

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

AXAPTA

4、group by 原理分析

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

5、group by 的简单执行流程

  1. 创建内存临时表,表里有两个字段author和count;
  2. 全表扫描article的记录,依次取出author= ‘X’的记录。
  • 判断临时表中是否有为 author=’X’的行,没有就插入一个记录 (X,1);
  • 如果临时表中有author=’X’的行的行,就将x 这一行的num值加 1;

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

就是把需要排序的字段,放到sort buffer,排完就返回。在这里注意一点哈,排序分全字段排序rowid排序

如果是全字段排序,需要查询返回的字段,都放入sort buffer,根据排序字段排完,直接返回

如果是rowid排序,只是需要排序的字段放入sort buffer,然后多一次回表操作,再返回。

怎么确定走的是全字段排序还是rowid 排序排序呢?由一个数据库参数控制的,max_length_for_sort_data

6、group by的一些优化方案

  • group by 后面的字段加索引
  • order by null 不用排序
  • 尽量只使用内存临时表
  • 使用SQL_BIG_RESULT

参考文章:

MySQL报错Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column whic - 范斯猫

group by的用法 - 范斯猫

select 与 where、group by、order by、limit 子句执行优先级比较 - 范斯猫

【sql】mysql分组查询group by的案例和原理 - 范斯猫

【数据库】分组数据 GROUP BY、HAVING - 范斯猫

http://www.lryc.cn/news/279823.html

相关文章:

  • 【重学C语言】一、C语言简介
  • 【MATLAB源码-第109期】基于matlab的哈里斯鹰优化算发(HHO)机器人栅格路径规划,输出做短路径图和适应度曲线。
  • NestJS 如何自定义中间件以及实际项目基于中间件提升项目开发效率
  • CMake入门教程【核心篇】设置和使用缓存变量
  • MinIO (五) .net core实现分片上传
  • 如何有效提高矢量网络分析仪的动态范围
  • Python 安卓开发:Kivy、BeeWare、Flet、Flutter
  • 50天精通Golang(第16天)
  • imx6ull基于yocto工程的l汇编点亮ed
  • vue 前端等比例压缩图片(再转换成文件后上传后端)
  • 解决在eclipse2021中,用mysql-connector-java-8.0.18.jar不兼容,导致无法访问数据库问题
  • 5 微信小程序
  • 百度面经整理(2024最新)
  • c++的构造函数
  • 基于ZU19EG的100G-UDP解决方案
  • 行为型设计模式——备忘录模式
  • 自定义HBase负载均衡器MyCustomBalancer实现步骤与代码解析
  • 企业网站建设中常用的英文翻译
  • vscode运行Python的两种方法,及无法运行的原因
  • 【猫头虎分享】全面揭秘鸿蒙4.0:华为的技术革新与市场影响
  • Java内存模型之可见性
  • 【docker】Docker Compose 使用介绍
  • uniapp怎么开发插件并发布
  • 为什么不直接public,多此一举用get、set,一文给你说明白
  • golang 记录一次协程和协程池的使用,利用ants协程池来处理定时器导致服务全部阻塞
  • 【Postman-windows-9.12.2版本安装与汉化】
  • 11Spring IoC注解式开发(下)(负责注入的注解/全注解开发)
  • Grafana Promtail 配置解析
  • 电脑DIY-主板参数
  • JVM知识总结(持续更新)