首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MariaDB SELECT 語句執行流程與子句解析順序深度解析

     編輯:MySQL 綜合教學

MariaDB/MySQL 查詢處理管線:從解析器到存儲引擎的完整路徑

理解 SELECT 語句的子句解析順序與執行流程,是編寫高效 SQL、診斷效能問題的基礎。本文基於 MariaDB 架構,系統梳理查詢流程圖、子句邏輯順序、關鍵優化節點、緩存機制、連接類型、子查詢處理與聯合查詢,並提供實戰範例與 EXPLAIN 分析指引。

一、SELECT 子句邏輯解析順序(非書寫順序)

FROM (過濾表) 
  → WHERE (過濾行) 
  → GROUP BY (分組) 
  → HAVING (分組過濾) 
  → SELECT (選取欄位/投影) 
  → ORDER BY (排序) 
  → LIMIT (結果限制)
  → 最終結果集

關鍵洞察:WHERE 不能使用 SELECT 別名(尚未投影),HAVING 可使用聚合別名(已分組計算),ORDER BY/LIMIT 在最後處理。

二、查詢流程圖核心節點

MariaDB 查詢流程圖

  1. 連接管理:線程池/連接池、權限驗證
  2. 查詢緩存:query_cache_type、query_cache_size(MySQL 8.0 已移除)
  3. 解析器:詞法/語法分析、AST 生成
  4. 優化器:邏輯重寫、索引選擇、連接順序、成本模型
  5. 執行器:調用存儲引擎 API、行級鎖、MVCC
  6. 存儲引擎:InnoDB/MyISAM/ColumnStore 等

三、核心子句與運算符實戰速查

1. WHERE 條件構建

類別運算符/語法範例
算術+, -, *, /, %age/2=11
比較=, !=, <>, <=>, >, >=, <, <=score >= 60
範圍BETWEEN min AND maxage BETWEEN 18 AND 60
集合IN (v1,v2,...), NOT INstatus IN (1,2,3)
空值IS NULL, IS NOT NULLdeleted_at IS NULL
模糊LIKE %/_ , RLIKE/REGEXPname LIKE 'Zhang%'
邏輯AND, OR, NOTactive=1 AND (role=1 OR role=2)

2. GROUP BY 與聚合函數

-- 混合排序
SELECT name, age FROM students ORDER BY age DESC, name ASC;

-- 配合 LIMIT 分頁
SELECT name, age FROM students ORDER BY age LIMIT 10 OFFSET 10;  -- 第 2 頁,每頁 10 條

4. DISTINCT 去重

SHOW GLOBAL VARIABLES LIKE 'query_cache%';
-- query_cache_type = ON/DEMAND/OFF
-- query_cache_size > 0 才生效

-- 顯式控制
SELECT SQL_CACHE * FROM students WHERE id = 1;      -- DEMAND 模式下緩存
SELECT SQL_NO_CACHE * FROM students WHERE id = 1;   -- 強制不緩存

-- 不緩存場景:含 NOW()/RAND()/UUID()、用戶自定義函數、大結果集

五、多表連接類型全景

連接類型語法語義效能特徵
交叉連接CROSS JOIN / FROM t1, t2笛卡爾積極高消耗,嚴禁無條件使用
內連接INNER JOIN / JOIN匹配行優化器可自由調整順序
等值連接ON t1.col = t2.col最常見內連接利用索引高效
左外連接LEFT JOIN / LEFT OUTER JOIN左表全保留左表驅動,右表無匹配填 NULL
右外連接RIGHT JOIN右表全保留等價 LEFT JOIN 交換順序
自然連接NATURAL JOIN同名欄位隱式匹配不可控,生產禁用
自連接表別名區分同表不同角色遞歸結構、層級查詢

六、子查詢與聯合查詢

子查詢分類

  • 標量子查詢:返回單值,可用於 SELECT/WHERE
  • 行子查詢:返回一行,用於行構造子比較
  • 表子查詢:返回結果集,用於 IN/EXISTS/FROM

實戰範例

欄位核心含義優化方向
type連接類型:system > const > eq_ref > ref > range > index > ALL避免 ALL,追求 ref/eq_ref
possible_keys可能用到的索引無索引 → 建立索引
key實際使用索引未用 → 強制索引/重寫
rows預估掃描行數越小越好,統計信息準確性關鍵
ExtraUsing index/where/temporary/filesort消除 temporary/filesort


九、總結

SELECT 執行流程遵循邏輯解析順序,優化器在物理執行層面進行深度重排。掌握子句語義順序、連接類型特徵、子查詢優化邊界、EXPLAIN 核心指標,是 SQL 調優的「內功心法」。建議:寫 SQL 前先想 EXPLAIN、上線前必跑 EXPLAIN ANALYZE、慢查詢必看 EXPLAIN,建立以執行計畫為中心的開發審查文化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved