普通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
英文地址,請注明出處:http://en.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;我們…