MySQL基礎篇(05):邏輯架構圖解和InnoDB儲存引擎詳解
阿新 • • 發佈:2020-03-02
> 本文原始碼:[GitHub·點這裡](https://github.com/cicadasmile/mysql-data-base) || [GitEE·點這裡](https://github.com/cicadasmile/mysql-data-base)
# 一、MySQL邏輯架構
## 1、邏輯架構圖
基於下面的邏輯架構圖,可以大致熟悉MySQL各個架構元件之間的協同工作關係。
![](https://img2020.cnblogs.com/blog/1691717/202003/1691717-20200302202735731-1843709187.jpg)
很經典的C/S架構風格,即客戶端/服務端模式。
## 2、分層描述
- 客戶端連線
通常會進行連線池管理,連線使用者許可權認證,安全管理等操作。
可以通過如下命令檢視連線配置資訊:`SHOW VARIABLES LIKE '%connect%';`可以看到最大連線和每個連線佔用的記憶體等相關配置。
- 核心功能
第二層架構封裝MySQL一系列核心操作,查詢解析、優化、快取、內建函式、觸發器、檢視等,跨儲存引擎的功能都在這一層實現。
- 儲存引擎
MySQL的最底層封裝,也是最核心的功能,不同的儲存引擎有不同的特點功能,共同點是處理資料的儲存和提取。
# 二、概念簡介
## 1、儲存引擎
MySQL資料庫儲存引擎是資料庫底層的架構元件,資料庫管理系統使用資料引擎進行建立、查詢、更新和刪除資料操作。不同的儲存引擎提供不同的儲存機制、索引技巧、鎖定水平等功能,使用不同的儲存引擎還具有不同的特點功能,以滿足不同場景下的業務需求。
## 2、支援關係
可以通過下面兩個命令檢視MySQL當前版本,和對儲存引擎的支援情況。
```sql
SELECT VERSION() ; SHOW ENGINES ;
```
可以看出本地環境是MySQL5.7,支援如下幾種儲存引擎:
![](https://img2020.cnblogs.com/blog/1691717/202003/1691717-20200302202752820-51432234.jpg)
該版本下預設的儲存引擎是:`InnoDB`,功能最為豐富和強大,支援事務,分散式事務,事務儲存點。
# 三、常見儲存引擎
## 1、InnoDB引擎
**(1)、基本描述**
InnoDB引擎是MySQL預設的事務型引擎,使用非常廣泛,極擅長處理短期事務,具有自動崩潰恢復的特性,在日常開發中,一般都要求使用該引擎。
**(2)、架構圖解**
- InnoDB架構圖
該圖片來自MySQL官網文件。
![](https://img2020.cnblogs.com/blog/1691717/202003/1691717-20200302202808134-405080129.jpg)
整體分三層:記憶體結構,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
```
![](https://img2018.cnblogs.com/blog/1691717/201908/1691717-20190823075428183-1996768