前言
接上文,本篇文章專門簡述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