普通MYSQL数据库是怎么做sum操作的

MySQL 的 SUM()操作实现是一个结合​​执行引擎优化、存储结构利用和分组算法​​的高效过程。以下是其核心实现机制和优化策略:


​1. 执行流程概览​

以查询为例:

SELECT department, SUM(salary) FROM employees GROUP BY department;

​执行步骤​​:

  1. 1.

    ​解析与优化​​:

    • ∙优化器决定是否使用索引、选择分组算法(排序或哈希)。
  2. 2.

    ​数据获取​​:

    • ∙通过存储引擎(InnoDB)扫描表或索引。
  3. 3.

    ​分组与聚合​​:

    • 按 department分组,实时累加 salary
  4. 4.

    ​返回结果​​:

    • 输出分组后的汇总结果。

​2. 关键实现机制​

​(1) 存储引擎层(InnoDB)的数据访问​

​全表扫描​​:

若无可用的索引,逐行读取数据(通过主键聚簇索引叶子节点)

  • 索引优化​​:∙

    • 若 GROUP BY列(如 department)有索引:∙

    • 直接顺序扫描索引,避免排序(索引本身有序)。∙

      • 无需回表,极大减少 I/O(例:INDEX (department, salary))。

    • 若查询只需索引列(覆盖索引):∙

​(2) 分组算法选择​

MySQL 根据数据量和内存动态选择分组策略:

  • 基于排序的分组(Sort-Based Grouping)​​:

    1. 1.

      按 GROUP BY列排序(使用 filesort)。

    2. 2.

      遍历有序数据,相同分组的值连续出现,直接累加 SUM()

      适用场景:数据量大或内存不足时,需磁盘临时表。∙

      1. 1.

        内存中构建哈希表,Key 为分组列哈希值。

      2. 2.

        每行计算哈希值,找到对应分组桶并更新 SUM()

        适用场景:内存充足且分组键重复率高时(MySQL 8.0+ 默认优先用哈希)。

  • ​基于哈希的分组(Hash-Based Grouping)​​:

​示例​​:

若 department的哈希值冲突少,哈希表直接更新 SUM(salary),无需排序。

​(3) 流式聚合(Streaming Aggregation)​
  • ​增量计算​​:

    • SUM()只需维护一个累加器(total += current_value),内存占用 O(1)。

    • 与 AVG()不同(需同时记录 sum和 count),SUM()无需额外状态。

  • ​内存与磁盘管理​​:

    • 若分组数据超出内存(tmp_table_size),自动转存到磁盘临时表。


​3. 优化技术​

​(1) 索引利用​
  • ​松散索引扫描(Loose Index Scan)​​:

    若 GROUP BY列是索引的最左前缀,直接跳过重复值读取(仅扫描不同分组),大幅减少 I/O。

    INDEX (department)→ 只需读取每个 department的第一行位置。

  • ​覆盖索引(Covering Index)​​:

    索引包含所有查询字段(如 INDEX (department, salary)),避免回表。

​(2) 聚合下推(Aggregation Pushdown)​
  • ​InnoDB 引擎条件​​:

    部分聚合可下推到存储引擎层(如处理 WHERE条件后预聚合)。

  • ​示例优化​​:

    SELECT department, SUM(salary) FROM employees WHERE hire_date > '2020-01-01' GROUP BY department;

    存储引擎先过滤 hire_date,再传递数据给聚合层。

​(3) 窗口函数优化(MySQL 8.0+)​
  • ​避免重复排序​​:

    若同一查询有多个聚合(如 SUM() OVER (PARTITION BY department)),复用分组排序结果。


​4. 高级场景处理​

​(1) 分布式聚合(如 MySQL Cluster)​
  • ​分片本地聚合​​:

    各节点先计算本地 SUM(),协调节点汇总结果。

  • ​减少网络传输​​:

    仅传输聚合结果而非原始数据。

​(2) 处理 NULL 值​
  • SUM()自动忽略 NULL值,无需额外过滤。

​(3) 精确性与溢出​
  • ​数据类型处理​​:

    • 整数类型:自动升级为 BIGINT避免溢出(如 SUM(INT)→ BIGINT)。

    • 浮点数:使用 DOUBLE,但可能有精度损失(建议用 DECIMAL)。

  • ​溢出保护​​:

    若结果超出数据类型范围,报错 ERROR 1690 (22003): BIGINT value is out of range


​5. 性能对比示例​

​场景​

​未优化​

​优化后​

全表扫描 + 排序分组

磁盘 I/O 高,临时表大

使用覆盖索引,内存哈希分组

GROUP BY无索引

全表扫描 + 磁盘 filesort

添加索引 → 松散索引扫描

大表分组聚合

内存溢出,频繁磁盘交换

分批处理 + 增量聚合


​总结​

MySQL 的 SUM()实现核心包括:

  1. 1.

    ​智能分组算法​​:哈希分组(内存优先) vs. 排序分组(磁盘兜底)。

  2. 2.

    ​索引加速​​:松散扫描、覆盖索引减少 I/O。

  3. 3.

    ​流式计算​​:增量更新累加器,内存高效。

  4. 4.

    ​溢出与精度管理​​:自动类型升级与 NULL处理。

​调优建议​​:

  • 为 GROUP BY列创建索引。

  • 尽量使用覆盖索引(避免 SELECT *)。

  • 监控临时表大小(调整 tmp_table_size和 max_heap_table_size)。

  • 对超大表考虑分批聚合(如分区表 + WHERE分段)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/96036.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/96036.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Claude-Flow AI协同开发:基础入门之 AI编排

1.1 引言:超越“代码生成器”的革命 在AI辅助开发的浪潮中,我们已经习惯了代码补全、函数生成等“代码生成器”工具。它们极大地提升了我们的编码效率,但通常仅限于解决孤立、单一的问题。当面对一个完整的项目或一个复杂的功能模块时&#x…

Linux中下载安装部署Redis7.4.5——并设置用户名、密码及其授权的保姆级教程

一、环境准备 环境准备 序号 说明 1 使⽤RHEL9或Almalinux9.1及其更高版本系统 #查看系统信息 cat /etc/os-release 2 Linux中需要Redis源码编译所需的gcc依赖 #1-检查是否已

健康度——设备健康续航条

在故障诊断与健康管理(PHM)领域和寿命预测领域中,健康度(Health Index, HI)是一个至关重要的概念,它旨在量化设备或系统的当前健康状态,并为预测其剩余使用寿命(Remaining Useful Li…

【Python - 类库 - BeautifulSoup】(02)使用“BeautifulSoup“按类名获取内容

使用BeautifulSoup按类名获取内容 在本文中,我们将介绍如何使用BeautifulSoup按类名获取内容的方法。BeautifulSoup是一个用于解析HTML和XML文档的Python库。它可以方便地遍历和搜索文档树,使得我们能够轻松地提取想要的信息。 安装BeautifulSoup 首先&a…

36.Java序列化与反序列化是什么

36.Java序列化与反序列化是什么 序列化就是把Java对象转换成字节流(二进制)。 把对象保存到本地文件或网络传输。因为Java对象在JVM的堆内存中,JVM堆不存在了,对象也就不在了。 反序列化就是把字节流转换为对象 从文件或者网络里获…

c#泛型公共类示例

在C#中&#xff0c;泛型类是一种可以操作多种数据类型的类。这使得你可以编写更灵活、可重用的代码。泛型类通过在类名后使用尖括号<>和类型参数来定义。类型参数可以是具体的类型&#xff0c;如int或string&#xff0c;也可以是其他泛型类型&#xff0c;甚至是其他泛型类…

深入理解算法效率——时间和空间复杂度详解

目录 一、引言&#xff1a;为什么我们需要分析算法效率&#xff1f; 二、算法效率的维度 2.1 时间复杂度&#xff08;Time Complexity&#xff09; 2.2 空间复杂度&#xff08;Space Complexity&#xff09; 三、深入理解算法时间复杂度 3.1 时间复杂度的基础概念 3.2 大…

排序---冒泡排序(Bubble Sort)

一、算法核心概念 冒泡排序是一种简单的交换排序算法&#xff0c;其核心思想是&#xff1a;通过重复遍历待排序数组&#xff0c;每次比较相邻的两个元素&#xff0c;若它们的顺序错误&#xff08;如升序排序中前一个元素大于后一个&#xff09;&#xff0c;则交换它们的位置。经…

MCP(模型上下文协议)入门教程

MCP&#xff08;模型上下文协议&#xff09;入门教程&#xff1a;连接AI与外部世界的万能插座 1 MCP是什么&#xff1f; 1.1 基本概念 MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;是一个开放协议&#xff0c;专门用于AI模型与外部数据源和…

GO开发遇到的报错问题合集

本文将记录平时在go开发中遇到的一些错误信息&#xff0c;踩过的坑&#xff0c;并分析原因及提供解决方法&#xff0c;持续更新中...1、grpc 接口请求报错&#xff1a;Error: 13 INTERNAL: Response message parsing error: invalid wire type 7 at offset 316原因&#xff1a;…

Node.js 做 Web 后端优势为什么这么大?

Node.js自诞生以来&#xff0c;一步步演变变为现代Web后端开发的基石之一。无论是初创公司快速构建原型&#xff0c;还是大型企业支撑高并发业务&#xff0c;好像它哪儿哪儿都在&#xff0c;甚至还有人觉得它威胁到了PHP的地位。 那为什么Node.js 做 Web 后端优势那么大&#x…

JAVA:IO流之字节输入流InputStream基础

我们知道&#xff0c;文件是写在磁盘中的&#xff0c;而程序的运行又要借助于内存。那么怎么实现内存和磁盘的“互动”呢&#xff1f;这就要借助“流”来实现了。内存具体指的就是我们的java程序&#xff0c;而磁盘具体指的是我们的文件。从磁盘到内存叫输入&#xff0c;从内存…

23种设计模式——桥接模式 (Bridge Pattern)详解

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a;设计模式 ✨特色专栏&#xff1a;知识分享 &#x…

Python爬虫实战:研究Axes Grid模块,构建旅游平台酒店数据采集和分析系统

1. 引言 1.1 研究背景 随着互联网技术的飞速发展,全球数据总量呈现指数级增长。据国际数据公司(IDC)预测,到 2025 年全球数据圈将达到 175ZB,其中非结构化数据占比超过 80%。这些数据广泛分布于各类网站平台,包含着用户行为、市场趋势、产品特征等丰富信息。如何高效获…

光照边疆平台|面向边疆地区的现代化内容与信息服务系统

光照边疆平台&#xff5c;面向边疆地区的现代化内容与信息服务系统聚焦“边疆资讯 边疆风光 用户互动 后台可视化管控”的高颜值内容平台&#xff0c;适合展示、传播与运营边疆主题内容。系统定位与价值 主题聚焦&#xff1a;以“边疆”为核心&#xff0c;统一内容语义与视觉…

删除元素(不是删除而是覆盖)快慢指针 慢指针是覆盖位置,快指针找元素

&#x1f4dd; 题目&#xff1a;移除元素题目描述&#xff1a; 给定数组和值val&#xff0c;原地移除所有等于val的元素&#xff0c;返回新长度。例子&#xff1a; nums [3,2,2,3], val 3 → nums [2,2,_,_], return 2&#x1f525; 暴力法思路&#xff1a;暴力法想法&#…

10 【C++】泛型编程

文章目录前言泛型编程&#xff08;模板&#xff09;1. 函数模板1.1 函数模板格式1.2 函数模板的实例化隐式实例化显式指定模板参数实例化1.3 函数模板实例化的原理1.4 模板参数的匹配原则2. 类模板2.1 类模板的格式2.2 类模板的实例化2.3 类模板实例化的原理2.4 类模板的匹配原…

【基于YOLO和Web的交通工具识别系统】

系统功能 视频检测&#xff1a;对输入的视频流进行实时或离线分析&#xff0c;自动识别视频中出现的交通工具&#xff08;如飞机、自行车等&#xff09;及行人&#xff0c;输出包含目标类别、位置等信息的检测结果。摄像检测&#xff1a;通过连接摄像头设备&#xff0c;对实时…

Python进程,线程

目录 一、多任务 1.1定义 1.2具体体现 1.3并发和并行 1.3.1并发操作 1.3.2并行操作 1.3.3对比 二、进程 2.1概念 2.2特点 2.3进程状态 2.4多进程 2.5多进程实现 2.6进程锁 三、线程 3.1概念 3.2特点 3.3适用场景 3.4多线程实现 四、对比 4.1关系对⽐ 4.2区…

【Element Plus 表单组件样式统一 CSS 文字特效实现指南】

Element Plus 表单组件样式统一 & CSS 文字特效实现指南 前言 在使用 Element Plus 组件库开发表单页面时&#xff0c;我们遇到了一个看似简单却很有趣的问题&#xff1a;el-input、el-select 和 el-textarea 在禁用状态下的文字颜色不一致。通过深入研究&#xff0c;我们…