一、MySQL邏輯架構
1、邏輯架構圖
基于下面的邏輯架構圖,可以大緻熟悉MySQL各個架構元件之間的協同工作關系。

很經典的C/S架構風格,即用戶端/服務端模式。
2、分層描述
- 用戶端連接配接
通常會進行連接配接池管理,連接配接使用者權限認證,安全管理等操作。
可以通過如下指令檢視連接配接配置資訊:
SHOW VARIABLES LIKE '%connect%';
可以看到最大連接配接和每個連接配接占用的記憶體等相關配置。
- 核心功能
第二層架構封裝MySQL一系列核心操作,查詢解析、優化、緩存、内置函數、觸發器、視圖等,跨存儲引擎的功能都在這一層實作。
- 存儲引擎
MySQL的最底層封裝,也是最核心的功能,不同的存儲引擎有不同的特點功能,共同點是處理資料的存儲和提取。
二、概念簡介
1、存儲引擎
MySQL資料庫存儲引擎是資料庫底層的架構元件,資料庫管理系統使用資料引擎進行建立、查詢、更新和删除資料操作。不同的存儲引擎提供不同的存儲機制、索引技巧、鎖定水準等功能,使用不同的存儲引擎還具有不同的特點功能,以滿足不同場景下的業務需求。
2、支援關系
可以通過下面兩個指令檢視MySQL目前版本,和對存儲引擎的支援情況。
SELECT VERSION() ; SHOW ENGINES ;
可以看出本地環境是MySQL5.7,支援如下幾種存儲引擎:
該版本下預設的存儲引擎是:
InnoDB
,功能最為豐富和強大,支援事務,分布式事務,事務儲存點。
三、常見存儲引擎
1、InnoDB引擎
(1)、基本描述
InnoDB引擎是MySQL預設的事務型引擎,使用非常廣泛,極擅長處理短期事務,具有自動崩潰恢複的特性,在日常開發中,一般都要求使用該引擎。
(2)、架構圖解
- InnoDB架構圖
該圖檔來自MySQL官網文檔。
整體分三層:記憶體結構,Cache,磁盤結構。
- 記憶體結構
記憶體結構又包括四大元件
Buffer Pool
:緩沖池:是主記憶體中的一個區域,在InnoDB通路表和索引資料時會在其中進行高速緩存,大量減少磁盤IO操作,提升效率。
Change Buffer
:寫緩沖區:避免每次增删改都進行IO操作,提升性能。
Adaptive Hash Index
:自适應哈希索引:使用索引關鍵字的字首建構哈希索引,提升查詢速度。
Log Buffer
:日志緩沖區:儲存要寫入磁盤上的日志檔案的資料,緩沖區的内容定期重新整理到磁盤。
- 磁盤結構
Tables
:資料表的實體結構。
Indexes
:索引的實體結構。
Tablespaces
:表空間,資料存儲區域。
Data Dictionary
:資料字典,存儲中繼資料資訊的表,例如表的描述,結構,索引等。
Doublewrite Buffer
:位于系統表空間的一個存儲區域,InnoDB在BufferPool中重新整理頁面時,會将資料頁寫入該緩沖區後才會寫入磁盤。
Redo Log
:記錄DML操作的日志,用來崩潰後的資料恢複。
Undo Logs
:資料更改前的快照,可以用來復原資料。
(3)、特點描述
- 支援事務
事務内在執行一組SQL語句時,要麼全部成功,要麼全部失敗。
- 支援分布式事務
分布式事務指即使不同操作位于不同的服務應用上,仍然需要保證事務的特性。常見場景:訂單和庫存在不同的服務中,但卻能保持一緻性。
- 支援行級鎖
加鎖時鎖定一行資料的鎖機制就是行級别鎖定(row-level)。MySQL5.7版本中隻有InnoDB引擎支援。鎖定的粒度小,自然支援的并發就高,鎖定的機制也随之變的複雜。
- 支援MVCC
多版本并發控制,通過儲存資料在某個時間點的快照來實作的。這意味着一個事務無論運作多長時間,在同一個事務裡能夠看到資料一緻的視圖。根據事務開始的時間不同,同時也意味着在同一個時刻不同僚務看到的相同表裡的資料可能是不同的。
- 支援聚簇索引
是一種對磁盤上實際資料重新組織以按指定的一個或多個列的值排序。由于聚簇索引的索引頁面指針指向資料頁面,是以使用聚簇索引查找資料幾乎總是比使用非聚簇索引快。
2、MyISAM引擎
(1)、基礎描述
MySQL5.1和之前版本的預設存儲引擎,不支援事務和行級鎖,自然崩潰之後不能自動恢複。
(2)、特點描述
- 鎖表機制
對整張表加鎖,不針對行加鎖,讀資料加共享鎖,寫資料加排他鎖。
- 全文索引
支援全文索引,一種基于分詞建立的索引,可以支援複雜的檢索查詢。
3、其他引擎
在MySQL的體系中,最常使用的就是InnoDB和MyISAM引擎,其他多樣的存儲引擎可以根據業務需求再去熟悉。
絮叨一句
:人生苦短,程式設計語言更是五馬六路,這點令人煩躁,是以學習的時候要挑重點,什麼是重點,使用最多的就是重點内容。
四、存儲引擎選擇
在公司的開發規範中,一般硬性要求使用InnoDB引擎,除非有怪癖的業務InnoDB無法支援。
五、源代碼位址
GitHub·位址
https://github.com/cicadasmile/mysql-data-base
GitEE·位址
https://gitee.com/cicadasmile/mysql-data-base