0

0

SQL 分组聚合分析优化技巧

舞夢輝影

舞夢輝影

发布时间:2026-02-25 20:23:51

|

296人浏览过

|

来源于php中文网

原创

group by字段顺序必须与复合索引最左前缀严格一致才能命中索引;count(*)性能最优且语义清晰;having不能减少中间结果集,应优先用where过滤;非group by列必须聚合或加入group by,否则报错或返回不可靠数据。

sql 分组聚合分析优化技巧

GROUP BY 字段顺序影响索引命中吗? 影响很大。MySQL 和 PostgreSQL 都要求 GROUP BY 字段顺序与复合索引的最左前缀严格一致,才能走索引;SQL Server 稍宽松,但乱序仍大概率退化为排序 + 哈希聚合。如果业务查询固定按 status, region 分组,却建了 (region, status) 索引,GROUP BY status, region 就无法利用该索引——优化器会先全表扫描再内存排序,小表不显,大表秒变慢。
  • 索引字段顺序必须和 GROUP BY 列顺序完全一致(含方向,如都 ASC)
  • 若同时有 ORDER BY,优先保证 GROUP BY 顺序,再追加 ORDER BY 字段到索引末尾
  • WHERE 条件字段应放在索引最左侧,再接 GROUP BY 字段(例如:WHERE created_at > '2024-01-01' AND status = 'active',GROUP BY region, category → 推荐索引:(status, created_at, region, category)

用 COUNT(*) 还是 COUNT(1) 或 COUNT(列名)? 在绝大多数场景下,COUNT(*) 是最优解。它由优化器直接识别为“行计数”,不检查字段是否为 NULL;而 COUNT(列名) 必须逐行判断该列是否非空,多一次 NULL 检查开销;COUNT(1) 虽无 NULL 判断,但仍是表达式计算,部分旧版 MySQL 会额外生成常量列,徒增 CPU 开销。
  • COUNT(*) 是标准写法,语义清晰、兼容性好、性能不输任何变体
  • COUNT(列名) 仅在明确需要排除 NULL 行时才用(比如统计有手机号的用户数)
  • 不要迷信“COUNT(1) 比 COUNT(*) 快”——这是过时经验,现代引擎已无实质差异,还可能误导可读性

HAVING 子句提前过滤能减少中间结果集吗? 不能。HAVING 是在分组完成之后才执行的筛选,它对聚合后的结果集做二次过滤,不影响分组过程本身的数据量。真正能减小中间结果的是把条件尽量前移到 WHERE(过滤原始行),或用子查询/CTE 先缩小数据范围再分组。
  • 错误认知:“HAVING status = 'done' 会跳过其他 status 的分组” → 实际上所有分组都会先算完,再筛
  • 正确做法:把可下推的过滤写进 WHERE,例如 WHERE status IN ('done', 'pending'),再 GROUP BY status
  • 复杂条件(如需基于聚合值过滤)才必须用 HAVING,比如 HAVING COUNT(*) > 100

聚合字段里混用非 GROUP BY 列会出什么错? MySQL 5.7 默认开启 sql_mode=ONLY_FULL_GROUP_BY 后,直接报错:Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column。即使关掉该模式,结果也极不可靠——数据库会从每组中随机选一行的某个字段值返回,表面跑通,实则数据错乱。
  • 所有出现在 SELECT 中、又没被聚合函数包裹的字段,必须完整出现在 GROUP BY 列表中
  • 常见翻车点:SELECT user_id, MAX(created_at), name FROM orders GROUP BY user_id —— name 没在 GROUP BY 里,也不聚合,非法
  • 安全写法:要么加进 GROUP BYGROUP BY user_id, name),要么用聚合函数(如 MAX(name),但注意语义是否合理)

聚合逻辑一旦涉及业务判断,就很容易在字段归属和执行顺序上绕晕。尤其当多个聚合函数混合、又带 HAVING 和子查询时,执行计划稍有偏差,结果就不是“慢一点”的问题,而是“错一点”。

云点滴客户关系管理CRM OA系统
云点滴客户关系管理CRM OA系统

云点滴客户解决方案是针对中小企业量身制定的具有简单易用、功能强大、永久免费使用、终身升级维护的智能化客户解决方案。依托功能强大、安全稳定的阿里云平 台,性价比高、扩展性好、安全性高、稳定性好。高内聚低耦合的模块化设计,使得每个模块最大限度的满足需求,相关模块的组合能满足用户的一系列要求。简单 易用的云备份使得用户随时随地简单、安全、可靠的备份客户信息。功能强大的报表统计使得用户大数据分析变的简单,

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

阿里巴巴推出的全能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,提供了直观易用的用户界面等等。

1027

2023.10.12

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

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

337

2023.10.27

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

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

379

2024.02.23

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

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

1842

2024.03.06

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

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

377

2024.03.06

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

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

1415

2024.04.07

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

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

585

2024.04.29

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

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

437

2024.04.29

batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

127

2026.02.25

热门下载

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

精品课程

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

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