Mysql架構與內部模組-第三章

 前言

接上文,本篇文章專門簡述Mysql存儲引擎,內容繁多,如果你只需知道每種存儲引擎的適用場景,可以直接查看本文最後列出的適用場景部分。

 

正文:

Mysql存儲引擎作為本系列文章中相對重要的一環,也是相關領域面試官問的比較多的一部分,能夠掌握不同的存儲引擎的區別,可以讓你在工作中有更加突出的表現。

存儲引擎首先其實它是一個進程,它能夠決定你的數據的存儲方式,管理方式,然後提供一些特性。

先帶著一個問題進入後面的內容:Mysql為什麼要設計如此多的存儲引擎?

Mysql存儲引擎是一種數據分布格式,從最直觀的角度來講,就是表文件在磁碟上的表現形式不同,文件個數不同,舉個例子:

我們新建一張表:member_a,存儲引擎選用InnoDB.

 

 

 然後我們查看member_a表在我們磁碟上的表現:

 

 

 包含兩個文件:member_a.frm以及member_a.ibd ,其中frm文件為表元數據文件,比如表結構等相關資訊,那麼也就是說,不管你採用什麼存儲引擎

xxx.frm文件都是必要存在的,因為只要你是一張表,那麼在你的磁碟上就會存在tableName.frm。

可以在你資料庫發生意外損壞時使用此文件進行恢復,恢復方法我在後續有時間的話也會另開一篇文章進行詳細說明各種存儲類型的恢復。

ibd文件是存放InnoDB數據的文件,當然也包括索引,除此之外還可能存在一個後綴為.ibdata的文件,此文件和ibd文件相同,那麼為什麼InnoDB會存在兩個不同類型的文件進行數據存儲?

實際上InnoDB具有兩種存儲方式:共享表空間存儲(ibdata),獨立表空間存儲(ibd) ,其可以通過配置來決定。

獨立表空間(ibd)為一張表一個xx.ibd文件。

共享表空間(ibdata)可以設置為所有表共享一個或者多個ibdata文件。

共享表空間的相關設置,本文就不做贅述,感興趣的朋友可以查閱相關資料。

 

然後我們再使用MyISAM存儲引擎創建表:member_b,然後觀察此表在磁碟上的結構:

 

 

 

 

 

 可以看到,除了必須存在的member_b.frm文件外,少了InnoDB引擎專有的xxx.ibd文件,多了MYD和MYI文件。

請注意這兩個文件是MyISAM引擎的特有文件,MYD存放表數據,MYI文件存放索引等資訊。

然後我們在新增一張使用MEMORY存儲引擎的表:member_c:

 

 

 

 

 

 可以看到,數據目錄下,member_c表只存在一個文件:member_c.frm。

以上舉例了3種比較常見的Mysql存儲引擎,在Mysql5.7以上的版本中,在創建表時,如果不指定表的存儲引擎,那麼默認為InnoDB引擎,下面將列出Mysql5.7全部的

存儲引擎列表及詳細說明

Mysql的存儲引擎分為以下種類:

InnoDB存儲引擎(5.7以上默認引擎)

MyISAM存儲引擎

MEMORY存儲引擎

CSV存儲引擎

ARCHIVE存儲引擎

BLACKHOLE存儲引擎

MERGE存儲引擎

FEDERATED存儲引擎

EXAMPLE存儲引擎

第三方存儲引擎(社區或者如果你對C語言非常熟悉,你可以根據Mysql提供的介面規範,自己寫上一個存儲引擎,那你是非常牛逼的,從這個地方其實也可以看出來,為什麼

我們的表在創建的時候指定了存儲引擎,在後續還能夠修改為不同的存儲引擎,因為這些存儲引擎都實現了同一套介面,跟JAVA為什麼能夠支援這麼多資料庫一樣的道理,

因為都實現了JDK提供的介面。)

以上例舉了Mysql目前支援的存儲引擎,可以看到種類繁多,他們的運用場景也大不相同,下面我們聊聊每種存儲引擎的不同:

InnoDB存儲引擎

InnoDB是一款高性能和高可用兼并的通用存儲引擎,在Mysql5.7以上,如果你在創建表時,不指定ENGINE為其他引擎,那麼默認將創建一個InnoDB引擎的表,

InnoDB表的DML操作遵循ACID模型,並且支援事物(提交,回滾,崩潰恢復),以保證用戶的數據安全,支援行級鎖定和Oracle風格的一致讀取,保證了多用戶並發和性能。

InnoDB表會將你的數據安排在磁碟上,並基於主鍵優化查詢,每個InnoDB表都有一個稱之為 聚集索引 的主鍵索引,這個索引將組織數據以最小化主鍵查找的I/O.

InnoDB支援MVCC,其實就是一致性非鎖定讀的技術,這個內容我們後續有時間會聊聊。

InnoDB支援外鍵。

InnoDB存儲引擎適用場景總結:適用於需要經常修改和插入,對並發和QPS要求較高,且對數據一致性要求較高的表。

以下是InnoDB在5.7版本中支援的功能:

特徵 支援
B樹索引
備份/時間點恢復(在伺服器中而不是在存儲引擎中實現。)
集群資料庫支援 沒有
聚集索引
壓縮數據
資料快取
加密數據 是(通過加密功能在伺服器中實現;在MySQL 5.7和更高版本中,支援靜態數據表空間加密。)
外鍵支援
全文搜索索引 是(MySQL 5.6和更高版本提供InnoDB對FULLTEXT索引的支援。)
地理空間數據類型支援
地理空間索引支援 是(MySQL 5.7和更高版本提供InnoDB對地理空間索引的支援。)
哈希索引 否(InnoDB在內部將哈希索引用於其自適應哈希索引功能。)
索引快取
鎖定粒度
MVCC
複製支援(在伺服器中而不是在存儲引擎中實現。)
儲存限制 64TB
T樹索引 沒有
交易次數
更新數據字典的統計資訊
 

MyISAM存儲引擎

MyISAM引擎是基於老舊的ISAM存儲引擎優化後的成果,使用MyISAM存儲引擎的表具有以下特點:

所有的數據值都是以低位元組存儲,此特徵可能不太適用於一些特殊的嵌入式系統。

所有的數字鍵值都先存儲高位元組,這要可以實現更好的索引壓縮。

支援大文件。

MyISAM存儲引擎的表,最大的索引數量為64,一個索引最多能夠關聯16列。

支援並發插入。

支援把數據文件和索引文件放在不同的物理機中。

不支援事務。

不支援外鍵。

MyISAM存儲引擎試用場景總結:適用於大量讀寫,不需要外鍵約束,不需要事務的表。

以下是InnoDB在5.7版本中支援的功能:

特徵 支援
B樹索引
備份/時間點恢復(在伺服器中而不是在存儲引擎中實現。)
集群資料庫支援 沒有
聚集索引 沒有
壓縮數據 是(僅當使用壓縮行格式時才支援壓縮MyISAM表。將壓縮行格式與MyISAM一起使用的表是只讀的。)
資料快取 沒有
加密數據 是(通過加密功能在伺服器中實現。)
外鍵支援 沒有
全文搜索索引
地理空間數據類型支援
地理空間索引支援
哈希索引 沒有
索引快取
鎖定粒度
MVCC 沒有
複製支援(在伺服器中而不是在存儲引擎中實現。)
儲存限制 256TB
T樹索引 沒有
交易次數 沒有
更新數據字典的統計資訊

 

因篇幅問題,今日暫時先介紹兩種存儲引擎,明日將帶來後續幾種存儲引擎的介紹。

FEDERATED