了解mysql的基礎架構, 理解大概的實現思想, 更有利與我們知之所以然, 是我們學習mysql起來思路更清晰, 效率更高.
思維導圖: mysql
基礎架構
1. 連接器
Mysql作為服務器,一個客戶端的Sql連接過來就需要分配一個線程進行處理,這個線程會專門負責監聽請求并讀取數據。
這部分的線程和連接管理都是有一個連接器,專門負責跟客戶端建立連接、權限認證、維持和管理連接。2. 解析器
SQL解析,就是按照SQL語法,把我們編寫的SQL語句進行詞法分析,理解這個SQL需要做什么事情.
比如如下SQL語句,就會被解析器給拆成三步邏輯:
select name, age, birthday from user where userId = '007';
- 查詢user表;
- 尋找到userId=007的那條數據;
- 將數據中的name、age、country字段信息提取出來;
-
3. 優化器
MySQL的優化器主要是將SQL經過語法解析/詞法解析后得到的語法樹,通過MySQL的數據字典和統計信息的內容,經過一系列運算,從而得出一個執行計劃樹的構成。之后MySQL按照執行樹的要求,計算得出結果。
優化器的輸入是一個語法樹,輸出是一個執行樹(也稱為執行計劃),SQL優化器的具體模塊參考如下圖:
mysql優化器.jpg
準備階段
-- 名稱識別:主要包括將找到并補全對應語句的表名,庫名等;
-- 語義檢查:通過數據字典如果找不到對應的表名,則直接返回報錯;
-- 初級語義變換:主要是根據語義規則,把一些外連接直接轉成內連接,子查詢EXIST轉成IN,然后IN再轉成SEMIJOIN等功能。邏輯變換
邏輯變換
-- 否定消除:對于多個表達式的和取或析取范式前面有否定的情況,應將關系條件分解成一個一個的,將外面的NOT消除;
-- 等值常量傳遞:利用了等值關系的傳遞特性,為了能夠盡早執行下推運算(后面會講到);
-- 常量表達式計算:對于能夠立刻計算出結果的表達式,直接計算結果,并將結果與其他條件盡量提前化簡。代價優化準備
基于代價的優化主要是用來確定對于每個表,根據條件是否應用索引,應用哪個索引, 確定多表連接的順序等問題。為了能夠進行代價優化,需要嘗試各種可能的方法,從而找到一個代價最小的方法。為了能夠比較,就需要給定義一個量化指標。
基于代價的優化,主要是為了確定采用如下哪一種方法(如果當前表存在該功能的條件下):
-- 采用哪種索引: 一個表可能有主鍵,也可能有外鍵,需要根據條件確定使用哪個索引;
-- 確定JOIN順序:不同的JOIN順序對性能影響極大;
-- 確定子查詢的執行策略: MySQL執行子查詢有相當多的方式, 具體涉及到代價模型, 代價量化方法. 這里先埋個坑, 后續寫個文章展開.
-
4. 執行器
這一步就是根據上一步驟優化器生成的SQL執行方案,去調用存儲引擎的接口(InnoDB、mysam)完成SQL語句的執行計劃,這個SQL引擎操作的有可能是內存數據,也有可能是磁盤文件。
補充:MySQL 8.0 版本直接將查詢緩存的整塊功能刪掉了,日常也不建議開啟使用。
文章標簽: #MYSQL基礎架構 #MYSQL
(注:部分內容來源于網路和一些學習資料,并非本人原著)