天天看點

mysql 系列:總體架構概述前言mysql 的架構模式mysql 的 2 個階段mysql 的 3 層架構總結

前言

使用 mysql 很多年了,但也沒怎麼深入研究過,準備最近了解下 mysql 的相關知識點。看看這款程式界裡的神器是怎麼運轉的。

mysql 的架構模式

mysql 采用的是 C/S 架構,也就是我們平常所說的用戶端-伺服器模型。像我們平常所用的 workbench、nacivat 就是用戶端,當然,還有指令行工具。

它們會根據指定的 ip、prot 連到伺服器,通過一定的協定來進行 SQL 的執行。這些協定包括最廣泛使用的 TCP 協定,也包括了适用于本地通信的套接字、共享記憶體、命名管道等。

mysql 的每一次連接配接在服務端都有一個專門的線程來管理,并且采用的網絡 IO 模型是 select/poll,并非 epoll。

主要是因為 select/poll 可移植性好,很多系統都支援。而且 mysql 的瓶頸不在于網絡連接配接上,對于連接配接數少,并且連接配接都很活躍的 mysql 而言,select/poll 是更好的選擇。

(注:select、poll、epoll 是 IO 多路複用模型,能同時監聽多個 I/O 事件的狀态,占用資源少,性能高。)

mysql 的 2 個階段

當伺服器接收到用戶端的請求連接配接後,将會進入連接配接階段和指令階段。

連接配接階段主要執行了以下任務:

  • 确定用戶端和伺服器目前的版本功能;
  • 确定是否需要進行 SSL 通信;
  • 服務端進行用戶端的身份認證;

當上面的連接配接階段 ok 後,将會進入指令階段,我們平常所見的 SQL 操作就是在這個階段執行的,如

  • COM_QUERY

    :用于向伺服器發送一個立即執行的 SQL 查詢
  • COM_CREATE_DB

    :用于建立資料庫的指令
mysql 系列:總體架構概述前言mysql 的架構模式mysql 的 2 個階段mysql 的 3 層架構總結

mysql 的 3 層架構

上面的 2 個階段是從 mysql 的連接配接生命周期來劃分的,實際從邏輯架構上,mysql 可以劃分為 3 層:

  • 連接配接層

    :主要負責連接配接池、通信協定、認證授權等;
  • SQL 層

    :這一層是 mysql 的大腦,通過一系列元件得到資料操作的最優解。
  • 存儲層

    :負責資料的存儲、檢索。
    mysql 系列:總體架構概述前言mysql 的架構模式mysql 的 2 個階段mysql 的 3 層架構總結

SQL 層

前面已經大體介紹過連接配接層了, 我們來看看 SQL 層,當接收到指令後,mysql 并不會傻乎乎的直接去拿資料,而是會分析目前 sql 語句的各種執行效率,進而獲得一個最優的執行計劃。

在 SQL 層主要分為了下面幾個功能:

  • Query cache

    :緩存查詢結果集,并且下次的查詢命中了緩存,那麼會跳過後面的執行,直接傳回緩存結果。
  • Parser

    :解析器,根據 SQL 語句建構内部使用的解析樹,用于友善擷取 SQL 資訊,如 SQL 的語義和文法資訊。
  • Optimizer

    :優化器,通過分析存儲引擎的操作成本以及表的統計資訊,輸出高效的執行計劃。比如在查詢分析中,表掃描或索引掃描哪個執行效率高,則選擇哪個。

除了上面功能外,mysql 的内置函數、存儲過程、觸發器、視圖也是在這一層實作的。

存儲層

前面提到過優化器會輸出執行計劃,而具體的實施則是在存儲層這一塊。存儲層在 mysql 這裡設計成了可插播的插件,也就是說隻要符合了标準化接口(API),那麼就可以實作屬于自己的一個存儲引擎。

存儲引擎是用來存儲、檢索資料的,不同的存儲引擎有不同的特性,像 InnoDB 支援事務、外鍵,而 MyISAM 就不支援。

一般我們不需要關心 SQL 語句會涉及到哪些存儲引擎,就像前面提到過的,已經通過标準化接口抽象出來了。隻是優化器這一層可能需要根據不同的存儲引擎做出不同的選擇。

總結

mysql 的總體架構就如上所述了,實際上,mysql 還有很多的重要知識點需要掌握,像

鎖的機制

MVCC 版本控制

查詢優化

等,掌握了這些,才算對 mysql 有一個總體認識,後面會繼續研究,分享給大夥!

感興趣的朋友可以搜一搜公衆号「 閱新技術 」,關注更多的推送文章。

可以的話,就順便點個贊、留個言、分享下,感謝各位支援!

閱新技術,閱讀更多的新知識。

mysql 系列:總體架構概述前言mysql 的架構模式mysql 的 2 個階段mysql 的 3 層架構總結