九、高性能基礎(一)MySQL體系結構與存儲引擎

1、MySQL 體系結構

MySQL 體系結構由 Client Connectors 層、MySQL Server 層及存儲引擎層組成。
(1)Client Connectors 層
負責處理客戶端的連接請求,與客戶端創建連接。目前 MySQL 幾乎支持所有的連接類型,例如常見的 JDBC、Python、Go 等。
(2)MySQL Server 層
MySQL Server 層主要包括 Connection Pool、Service & utilities、SQL interface、Parser解析器、Optimizer 查詢優化器、Caches 緩存等模塊。

  • Connection Pool,負責處理和存儲數據庫與客戶端創建的連接,一個線程負責管理一個連接。Connection Pool 包括了用戶認證模塊,就是用戶登錄身份的認證和鑒權及安全管理,也就是用戶執行操作權限校驗。
  • Service & utilities 是管理服務&工具集,包括備份恢復、安全管理、集群管理服務和工具。
  • SQL interface,負責接收客戶端發送的各種 SQL 語句,比如 DML、DDL 和存儲過程等。
  • Parser 解析器會對 SQL 語句進行語法解析生成解析樹。
  • Optimizer 查詢優化器會根據解析樹生成執行計劃,并選擇合適的索引,然后按照執行計劃執行 SQL 語言并與各個存儲引擎交互。
  • Caches 緩存包括各個存儲引擎的緩存部分,比如:InnoDB 存儲的 Buffer Pool、MyISAM 存儲引擎的 key buffer 等,Caches 中也會緩存一些權限,也包括一些 Session 級別的緩存。

(3)存儲引擎層
存儲引擎包括 MyISAM、InnoDB,以及支持歸檔的 Archive 和內存的 Memory 等。MySQL是插件式的存儲引擎,只要正確定義與 MySQL Server 交互的接口,任何引擎都可以訪問MySQL,這也是 MySQL 流行的原因之一。

存儲引擎底部是文件的物理存儲層,包括二進制日志、數據文件、錯誤日志、慢查詢日志、全日志、redo/undo 日志等。

接下來用一條 SQL SELECT 語句的執行軌跡來說明客戶端與 MySQL 的交互過程,如下圖所示:

①通過客戶端/服務器通信協議與 MySQL 建立連接。
②查詢緩存,這是 MySQL 的一個可優化查詢的地方,如果開啟了 Query Cache 且在查詢緩存過程中查詢到完全相同的 SQL 語句,則將查詢結果直接返回給客戶端;如果沒有開啟Query Cache 或者沒有查詢到完全相同的 SQL 語句則會由解析器進行語法語義解析,并生成解析樹。
③預處理器生成新的解析樹。
④查詢優化器生成執行計劃。
⑤查詢執行引擎執行 SQL 語句,此時查詢執行引擎會根據 SQL 語句中表的存儲引擎類型,以及對應的 API 接口與底層存儲引擎緩存或者物理文件的交互情況,得到查詢結果,由MySQL Server 過濾后將查詢結果緩存并返回給客戶端。若開啟了 Query Cache,這時也會將SQL 語句和結果完整地保存到 Query Cache 中,以后若有相同的 SQL 語句執行則直接返回結果。

2、存儲引擎概述

存儲引擎是 MySQL 中具體與文件打交道的子系統,它是根據 MySQL AB 公司提供的文件訪問層抽象接口定制的一種文件訪問機制,這種機制就叫作存儲引擎。下面是一些常用的存儲引擎,有遠古時期的 MyISAM、支持事務的 InnoDB、內存類型的 Memory、歸檔類型的 Archive、列式存儲的 Infobright,以及一些新興的存儲引擎,以 RocksDB 為底層基礎的 MyRocks 和 RocksDB,和以分形樹索引組織存儲的 TokuDB,當然現在還有極數云舟出品的分布式存儲引擎 ArkDB,如下圖所示。

在 MySQL 5.6 版本之前,默認的存儲引擎都是 MyISAM,但 5.6 版本以后默認的存儲引擎就是 InnoDB 了。

InnoDB 存儲引擎的上半部分是實例層(計算層),位于內存中,下半部分是物理層,位于文件系統中,如下圖所示。

(1)實例層
實例層分為線程和內存。InnoDB 重要的線程有 Master Thread,Master Thread 是 InnoDB 的主線程,負責調度其他各線程。

Master Thread 的優先級最高, 其內部包含幾個循環:主循環(loop)、后臺循環(background loop)、刷新循環(flush loop)、暫停循環(suspend loop)。Master Thread 會根據其內部運行的相關狀態在各循環間進行切換,大部分操作在主循環(loop)中完成,其包含 1s 和 10s 兩種操作。

(2)物理層
物理層在邏輯上分為系統表空間、用戶表空間和 Redo日志。

系統表空間里有 ibdata 文件和一些 Undo,ibdata 文件里有 insert buffer 段、double write段、回滾段、索引段、數據字典段和 Undo 信息段。

用戶表空間是指以 .ibd 為后綴的文件,文件中包含 insert buffer 的 bitmap 頁、葉子頁(這里存儲真正的用戶數據)、非葉子頁。InnoDB 表是索引組織表,采用 B+ 樹組織存儲,數據都存儲在葉子節點中,分支節點(即非葉子頁)存儲索引分支查找的數據值。

Redo 日志中包括多個 Redo 文件,這些文件循環使用,當達到一定存儲閾值時會觸發checkpoint 刷臟頁操作,同時也會在 MySQL 實例異常宕機后重啟,InnoDB 表數據自動還原恢復過程中使用。

3、InnoDB 和 MyISAM

InnoDB 和 MyISAM 的功能對比如下圖所示:

在性能對比上,InnoDB 也完勝 MyISAM,如下圖所示:

4、InnoDB 存儲引擎

InnoDB 存儲引擎的核心特性包括:MVCC、鎖、鎖算法和分類、事務、表空間和數據頁、內存線程以及狀態查詢。

5、ARIES 三原則

  • 先寫日志后寫磁盤,日志成功寫入后事務就不會丟失,后續由 checkpoint 機制來保證磁盤物理文件與 Redo 日志達到一致性;

  • 利用 Redo 記錄變更后的數據,即 Redo 記錄事務數據變更后的值;

  • 利用 Undo 記錄變更前的數據,即 Undo 記錄事務數據變更前的值,用于回滾和其他事務多版本讀。

6、總結回顧

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。