0

0

mysql如何优化group by查询_mysql分组查询效率优化

P粉602998670

P粉602998670

发布时间:2026-03-15 08:18:01

|

740人浏览过

|

来源于php中文网

原创

GROUP BY 慢主要因未走索引触发临时表和文件排序;需按最左前缀建联合索引,确保SELECT非聚合列在索引左侧,避免SELECT *,控制分组基数,并调优tmp_table_size等参数。

mysql如何优化group by查询_mysql分组查询效率优化

为什么 GROUP BY 会慢?先看执行计划里的 key 字段

MySQL 执行 GROUP BY 时,默认可能走不了索引,尤其当 SELECT 列和 GROUP BY 列不一致、或存在 HAVING 过滤、或用了非前缀字段排序时,容易触发临时表(Using temporary)和文件排序(Using filesort)。这两个标志一出现,基本就说明性能有隐患。

EXPLAIN 查看执行计划,重点盯紧 type(是否为 ref/range)、key(是否命中索引)、Extra(是否含 Using temporaryUsing filesort)。

给 GROUP BY 字段建联合索引的三个硬规则

不是随便加个索引就行。MySQL 的 GROUP BY 优化依赖「最左前缀 + 排序友好」,必须同时满足:

  • 索引顺序必须严格匹配 GROUP BY 字段顺序(例如 GROUP BY a, b,索引得是 (a, b),不能是 (b, a)
  • 如果带 ORDER BY,且字段顺序/方向与 GROUP BY 一致(如 GROUP BY a, b ORDER BY a, b),可复用同一索引;若方向相反(如 ORDER BY a DESC, b ASC),MySQL 8.0+ 才支持降序索引,5.7 及以前会退化为文件排序
  • SELECT 中的非聚合列(如 SELECT a, b, MAX(c) 中的 a, b)必须包含在索引最左侧,否则仍需回表,甚至放弃索引

示例:对 SELECT dept_id, COUNT(*) FROM user GROUP BY dept_id,建索引 ALTER TABLE user ADD INDEX idx_dept (dept_id) 即可;但若写成 SELECT dept_id, name, COUNT(*) ... GROUP BY dept_id,而 name 不在索引里,就可能失效。

避免 SELECT * 和多余聚合字段拖慢 GROUP BY

SELECT *GROUP BY 查询的大忌——它强制 MySQL 先分组再回表取所有列,极大增加 I/O 和内存开销。更隐蔽的问题是「隐式 ANY_VALUE 行为」:开启 sql_mode=ONLY_FULL_GROUP_BY(默认开启)时,MySQL 会报错;关掉它虽能运行,但结果不可控。

实操建议:

百度AI搜
百度AI搜

百度全新AI搜索引擎

下载
  • SELECT 明确需要的分组字段和聚合函数,如 SELECT dept_id, COUNT(*), AVG(salary)
  • 若真要带其他字段(如每个部门的「最早入职员工姓名」),改用 ROW_NUMBER() 窗口函数(MySQL 8.0+)或关联子查询,别硬塞进 GROUP BY
  • 检查 GROUP BY 字段基数:如果 dept_id 只有 5 个值,但表有千万行,分组本身快;但如果 GROUP BY order_time(精确到秒),分组键太多,临时表膨胀,此时应考虑按天/小时聚合预计算

临时表和排序参数调优的临界点

当无法避免临时表时,至少不让它落到磁盘上。关键参数是 tmp_table_sizemax_heap_table_size,二者取小值决定内存临时表上限。若分组结果集超过该值,MySQL 会转用 MyISAM 临时表(磁盘),性能断崖下跌。

查当前设置:SHOW VARIABLES LIKE 'tmp_table_size';,生产环境建议设为 64M~256M(根据可用内存按比例分配);同时确认 max_heap_table_size 不低于该值。

另一个易忽略点:sort_buffer_size 影响 GROUP BY 内部排序效率,但它 per-thread 分配,不宜设过大(如 > 4M),否则并发高时内存爆炸。

真正卡顿的往往不是 SQL 写法,而是分组键分布极度倾斜(比如 99% 数据集中在某 1 个 dept_id),这时单个分组处理时间远超平均值,监控 Performance Schemaevents_statements_summary_by_digest 能定位这类长尾查询。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

1135

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

340

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

381

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2214

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

380

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1723

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

586

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

441

2024.04.29

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2.6万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 850人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号