從底層設計原理分析并理解SQL 的執行順序

?一、執行順序的底層設計原理??

??1. 數據源的確定與連接(FROM → ON → JOIN)??
??FROM??:數據庫首先需要確定數據的物理來源,從磁盤加載表或子查詢的原始數據。此時尚未應用任何篩選,僅讀取元數據(如數據塊位置)。
??ON??:在 JOIN 操作中,ON 條件用于??連接時的行級過濾??。例如在多表關聯時,ON 會先篩選出滿足連接條件的行組合,生成中間結果集。
??JOIN??:根據 ON 的條件合并數據,此時可能生成笛卡爾積的中間結果(如未優化的情況)。數據庫會優先執行連接操作,因為連接后的數據集規模直接影響后續處理成本。
??設計意義??:盡早確定數據關聯關系,避免在復雜計算中反復訪問磁盤。例如,若兩張表各有 100 萬行,未經優化的 JOIN 可能產生 1 萬億行中間結果,而先連接再過濾可顯著減少后續處理量。

??2. 行級過濾(WHERE)??
WHERE 在 JOIN 之后執行,對連接后的中間結果進行??行級過濾??。例如 WHERE age > 18 會剔除不滿足條件的行。
??關鍵限制??:WHERE 中不能直接使用聚合函數(如 SUM()),因為此時尚未分組。
??原理優勢??:在數據量最大的階段(原始表或連接后的中間表)盡早過濾,減少后續處理的行數。例如,若 WHERE 過濾掉 90% 的行,后續 GROUP BY 的計算量將降低一個數量級。

??3. 分組與聚合(GROUP BY → HAVING)??
??GROUP BY??:按指定列將數據分組,并觸發聚合函數(如 COUNT(), SUM())的計算。此時生成分組鍵和聚合值的映射表。
??HAVING??:對分組后的結果進行過濾,類似于 WHERE 但作用于分組數據。例如 HAVING SUM(sales) > 1000 會剔除總銷售額不足的組。
??設計邏輯??:分組操作需要完整的數據分布信息,因此必須在數據加載和過濾后進行。HAVING 在分組后執行,避免在原始數據上重復計算聚合值。

??4. 結果投影與去重(SELECT → DISTINCT)??
??SELECT??:最后階段確定最終返回的列,包括:
列名的別名生效(如 SUM(sales) AS total)
計算表達式(如 price * quantity)
聚合值的最終輸出
??DISTINCT??:對 SELECT 的結果集去重。由于去重需要完整的結果集,必須在 SELECT 之后執行。
??性能考量??:延遲列選擇和計算可避免中間階段的冗余處理。例如,若某列在 WHERE 中未使用,但在 SELECT 中出現,引擎可跳過該列的前期加載。

??5. 排序與分頁(ORDER BY → LIMIT)??
??ORDER BY??:對最終結果集排序。由于排序需要內存或臨時文件,放在最后可減少排序的數據量。
??LIMIT??:限制返回行數。在排序后執行,確保只保留排名靠前的行。
??資源優化??:若先執行 LIMIT 再排序,可能因截斷數據導致結果錯誤。例如 LIMIT 10 配合 ORDER BY 需要先排序全部數據再取前 10 行。

??二、為何 SELECT 在最后執行???

??1. 延遲計算原則??
??避免無效計算??:若 SELECT 中包含復雜表達式(如 LOWER(name)),但 WHERE 條件過濾掉了大部分行,延遲計算可節省 CPU 資源。
??覆蓋索引優化??:若查詢只需索引列,引擎可直接讀取索引樹,跳過數據行加載(稱為「覆蓋索引」)。這種優化依賴于 SELECT 階段的列選擇信息。
??2. 邏輯一致性??
??別名可見性??:SELECT 中定義的別名(如 total_sales)只能在后續階段(如 ORDER BY)使用,因為引擎需要先完成列的計算。
??聚合函數依賴??:HAVING 中的聚合值必須在 GROUP BY 之后才能確定,而 SELECT 需要基于這些值進行投影。

??三、執行順序的例外與優化??

??1. 優化器的物理調整??
雖然邏輯順序固定,但數據庫優化器可能通過??謂詞下推??(Predicate Pushdown)等技術改變物理執行順序。例如:

將 WHERE 條件提前到 JOIN 之前,減少連接時的數據量。
將 HAVING 中的過濾合并到 WHERE 中(當條件不依賴分組時)。
??2. 窗口函數的特殊性??
窗口函數(如 ROW_NUMBER())在 SELECT 階段執行,但需要依賴完整的分區數據。其計算晚于 WHERE 和 GROUP BY,但早于 ORDER BY 和 LIMIT。

??四、總結??

??最小化數據處理量??:通過層層過濾(WHERE → GROUP BY → HAVING),逐步縮減數據集規模。
??資源高效利用??:延遲計算(如 SELECT)和按需排序(ORDER BY)減少內存和 CPU 消耗。
??邏輯一致性??:確保別名、聚合值等依賴關系正確解析。
這種順序設計體現了數據庫引擎「先粗后細」的處理哲學——從海量原始數據中逐步提煉出精確結果,而非人類直覺的「先選擇后處理」。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/79956.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79956.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/79956.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

游戲引擎學習第237天:使用 OpenGL 顯示圖像

win32_game.cpp: 禁用 PFD_DOUBLEBUFFER 我們正在處理一個新的開發階段,目標是在使用 OpenGL 渲染的同時能正常通過 OBS 進行直播。昨天我們已經嘗試了一整天來解決這個問題,希望能找到一種方式讓 OBS 能正確地捕捉到 OpenGL 的窗口畫面。雖然我們不確定…

(二)mac中Grafana監控Linux上的MySQL(Mysqld_exporter)

框架:GrafanaPrometheusMysqld_exporter 一、監控查看端安裝 Grafana安裝-CSDN博客 普羅米修斯Prometheus監控安裝(mac)-CSDN博客 1.啟動Grafana服務 brew services start grafana 打開瀏覽器輸入http://localhost:3000進入grafana登錄…

GitHub 趨勢日報 (2025年04月17日)

本日報由 TrendForge 系統生成 https://trendforge.devlive.org/ 📈 今日整體趨勢 Top 10 排名項目名稱項目描述今日獲星總星數語言1Anduin2017/HowToCook程序員在家做飯方法指南。Programmer’s guide about how to cook at home (Simplified Chinese onl…? 224…

(一)mac中Grafana監控Linux上的CPU等(Node_exporter 安裝使用)

框架:GrafanaPrometheusNode_exporter 機器狀態監控(監控服務器CPU,硬盤,網絡等狀態) Node_exporter安裝在被測服務器上,啟動服務 各步驟的IP地址要換為被測服務器的IP地址Prometheus.yml的 targets值網頁訪問的ip部分grafana添加數據源的…

java IO/NIO/AIO

(?▽?)曼波~~~~!讓曼波用最可愛的賽馬娘方式給你講解吧!(? ???ω??? ?) 🎠曼波思維導圖大沖刺(先看框架再看細節哦): 📚 解釋 Java 中 IO、NIO、AIO 的區別和適用場景: …

Silverlight發展歷程(微軟2021年已經停止支持Silverlight 5)

文章目錄 Microsoft Silverlight 發展歷程引言起源與背景(2006-2007)互聯網技術格局與微軟的挑戰WPF/E 項目的啟動 Silverlight 1.0 的誕生(2007)正式命名與首次發布初步的市場定位 Silverlight 2.0:真正的突破&#x…

【大數據、數據開發與數據分析面試題匯總(含答案)】

在大數據、數據開發與數據分析領域的面試中,扎實掌握各類知識點至關重要。以下是精心整理的面試題,涵蓋單選題和多選題,助你備考一臂之力。 試題目錄 大數據、數據開發與數據分析高頻面試題解析1. 數據倉庫分層架構設計2. 維度建模與范式建模…

Docker部署禪道21.6開源版本

將數據庫相關環境變量分開,增加注釋或空格使得命令更易讀。 如果你的 MySQL 主機、端口等配置沒有變化,應該確保這些信息是安全的,并考慮使用 Docker secrets 或環境變量配置來避免直接暴露敏感信息。 docker run -d -it --privilegedtrue …

Yocto項目實戰教程 · 第4章:4.2小節-菜譜

🔍 B站相應的視頻教程: 📌 Yocto項目實戰教程-第4章-4.2小節-菜譜 記得三連,標為原始粉絲。 在 Yocto 項目中,**菜譜(Recipe)**承載了包的配置信息、源碼獲取方式、編譯與安裝步驟,是…

【pytorch】torch.nn.Unfold操作

說明 一個代碼里涉及到了unfold的操作,看了半天官網都沒整明白維度怎么變化的,參考這個鏈接搞明白了: https://blog.csdn.net/ViatorSun/article/details/119940759 https://zhuanlan.zhihu.com/p/361140988 維度計算 輸入( N,…

Linux 固定IP地址

一.查看網口狀態: $ ip a 二.配置靜態IP文件: $ sudo vi /etc/network/interface auto eth0 iface eth0 inet static address 192.168.0.252 gateway 192.168.0.1 netmask 255.255.255.0 #network 192.168.0.0 #broadcast 192.168.0.255 三.重啟網卡讓新…

android的 framework 有哪些知識點和應用場景

Android Framework 知識點 1. 四大組件 Activity(活動) 是 Android 應用中最基本的組件,用于實現用戶界面。一個 Activity 通常對應一個屏幕的內容。有自己的生命周期,包括 onCreate、onStart、onResume、onPause、onStop、onDe…

如何在PDF.js中改造viewer.html以實現PDF的動態加載

在PDF.js中改造viewer.html實現PDF動態加載,需結合參數傳遞、文件流處理及跨域配置等技術。以下是綜合多個技術方案的核心實現步驟: ?一、基礎參數傳遞法? 1. ?URL參數動態加載? 通過修改viewer.html的URL參數傳遞PDF路徑,適用于靜態文…

組件之間的數據通信方式

Vue 的傳值方式(即組件之間的數據通信方式)根據組件關系不同(父子、兄弟、跨層級)有所區別。下面是常見的傳值方式,按使用場景來分類: 一、父子組件傳值 1. props(父 -> 子) 父…

組件是怎樣寫的(1):虛擬列表-VirtualList

本篇文章是《組件是怎樣寫的》系列文章的第一篇,該系列文章主要說一下各組件實現的具體邏輯,組件種類取自 element-plus 和 antd 組件庫。 每個組件都會有 vue 和 react 兩種實現方式,可以點擊 https://hhk-png.github.io/components-show/ …

個性化的配置AndroidStudio

Android Studio 提供諸多向導和模板,可用于驗證 Java 開發套件 (JDK) 和可用 RAM 等系統要求,以及配置默認設置,例如經過優化的默認 Android 虛擬設備 (AVD) 模擬和更新的系統映像。本文檔介紹了可用于自定義 Android Studio 使用方式的其他配…

人類行為的原動力是自我保存-來自ChatGPT

自我保存(Self-Preservation)確實可以說是人類行為最原始、最底層的驅動力。 簡單來說: 無論我們做什么,表面看動機五花八門,實際上歸根到底都繞不開活下去、保護自己。 💡 從不同層面理解這個觀點&#…

SystemVerilog語法之內建數據類型

簡介:SystemVerilog引進了一些新的數據類型,具有以下的優點:(1)雙狀態數據類型,更好的性能,更低的內存消耗;(2)隊列、動態和關聯數組,減少內存消耗…

藍光三維掃描技術:高效精密測量相機鏡頭底座注塑件

如今越來越多的攝影愛好者、vlog拍攝者使用數碼相機以及無人機,隨時隨地記錄生活中的每一刻美好瞬間,對相機設備的要求也不斷提高。 — 案例背景 — 相機鏡頭底座涉及鏡頭裝置可靠、螺絲位置度連接以及殼體組裝,鏡頭底座注塑件生產廠商&…

【前端】【面試】【業務場景】前端如何獲取并生成設備唯一標識

? 總結 問題:前端如何獲取并生成設備唯一標識? 核心要點:瀏覽器原生信息有限,但通過組合多個維度可生成設備指紋(Device Fingerprint),用于唯一標識設備。 常見方式: 瀏覽器信息&…