MySQL系列:架構
SQL 執行過程
- 首先客戶端傳送請求到服務端,建立連線;
- 服務端先看下查詢快取是否命中,命中就直接返回,否則繼續往下執行;
- 接著來到解析器,進行語法分析,一些系統關鍵字校驗,校驗語法是否合規;
- 然後優化器進行SQL優化,比如怎麼選擇索引之類,然後生成執行計劃;
- 最後執行引擎呼叫儲存引擎API查詢資料,返回結果。
MySQL 的架構模式
MySQL 採用的是 C/S 架構(客戶端-伺服器模型)。
客戶端有很多:圖形化介面,命令列,程式碼等。
客戶端會根據指定的 ip、prot 連到伺服器,通過一定的協議來進行 SQL 的執行。這些協議包括最廣泛使用的 TCP 協議,也包括了適用於本地通訊的套接字、共享記憶體、命名管道等。
MySQL 的每一次連線在服務端都有一個專門的執行緒來管理,並且採用的網路 IO 模型是 select/poll,並非 epoll。
主要是因為 select/poll 可移植性好,很多系統都支援。而且 mysql 的瓶頸不在於網路連線上,對於連線數少,並且連線都很活躍的 mysql 而言,select/poll 是更好的選擇。
(注:select、poll、epoll 是 IO 多路複用模型,能同時監聽多個 I/O 事件的狀態,佔用資源少,效能高。)
MySQL 的兩個階段
從 MySQL 的連線生命週期來劃分,當伺服器接收到客戶端的請求連線後,將會進入兩個階段:
- 連線階段
- 命令階段
連線階段的主要任務:
- 確定客戶端和伺服器當前的版本功能
- 確定是否需要進行 SSL 通訊
- 服務端進行客戶端的身份認證
連線階段驗證成功後,將會進入命令階段,SQL 操作就是在這個階段執行的。
MySQL 的 3 層架構
從邏輯架構上,MySQL 可以劃分為 3 層:
- 連線層:主要負責連線池、通訊協議、認證授權等
- 作為客戶端和服務端的連線,聯結器負責處理和客戶端的連線,還有一些許可權認證之類,比如客戶端通用使用者名稱密碼連線到 MySQL 伺服器,還有對於資料庫表的執行許可權
- SQL層:得到資料操作的最優解
- 這一層是 Mysql 的核心層,基本上 MySQL 大部分的核心功能都在這一層,包括查詢快取、解析器、優化器之類,通過這一系列元件進行 SQL 解析、優化、索引選擇、生成執行計劃,最後得到資料操作的最優解
- 儲存層:負責資料的儲存、檢索
- MySQL 通過執行引擎直接呼叫儲存引擎API查詢資料庫中資料
SQL 層
當接收到命令後,MySQL 會分析當前 SQL 語句的各種執行效率,進而獲得一個最優的執行計劃。
SQL 層的主要功能:
- Query cache
- 快取查詢結果集,並且下次的查詢命中了快取,那麼會跳過後面的執行,直接返回快取結果
- Parser(解析器)
- 根據 SQL 語句構建內部使用的解析樹,用於方便獲取 SQL 資訊,如 SQL 的語義和語法資訊
- Optimizer(優化器)
- 通過分析儲存引擎的操作成本以及表的統計資訊,輸出高效的執行計劃。比如在查詢分析中,表掃描或索引掃描哪個執行效率高,則選擇哪個
除了上面功能外,MySQL 的內建函式、儲存過程、觸發器、檢視也是在這一層實現的。
儲存層
過優化器會輸出執行計劃,而具體的實施則是在儲存層這一塊。儲存層在 MySQL 這裡設計成了可插播的外掛,也就是說只要符合了標準化介面(API),那麼就可以實現屬於自己的一個儲存引擎。
儲存引擎是用來儲存、檢索資料的,不同的儲存引擎有不同的特性,像 InnoDB 支援事務、外來鍵,而 MyISAM 就不支援。
一般我們不需要關心 SQL 語句會涉及到哪些儲存引擎,只是優化器這一層可能需要根據不同的儲存引擎做出不同的選擇。