存儲引擎是MySQL組件,用于處理不同表類型的SQL操作。
InnoDB是默認的、最通用的存儲引擎,Oracle默認使用其創建表。(MySQL 8.0中的CREATE TABLE語句默認創建InnoDB表。)
MySQL Server使用可插拔存儲引擎體系結構,使存儲引擎能夠加載到正在運行的MySQL服務器中或從中卸載。
要確定服務器支持哪些存儲引擎,請使用SHOW engines語句。
Support列中的值指示是否可以使用引擎。值YES、NO或DEFAULT表示某個引擎可用、不可用或可用,并且當前設置為默認存儲引擎。
mysql> SHOW ENGINES\G
*************************** 1. row ***************************Engine: PERFORMANCE_SCHEMASupport: YESComment: Performance Schema
Transactions: NOXA: NOSavepoints: NO
*************************** 2. row ***************************Engine: InnoDBSupport: DEFAULTComment: Supports transactions, row-level locking, and foreign keys
Transactions: YESXA: YESSavepoints: YES
*************************** 3. row ***************************Engine: MRG_MYISAMSupport: YESComment: Collection of identical MyISAM tables
Transactions: NOXA: NOSavepoints: NO
*************************** 4. row ***************************Engine: BLACKHOLESupport: YESComment: /dev/null storage engine (anything you write to it disappears)
Transactions: NOXA: NOSavepoints: NO
*************************** 5. row ***************************Engine: MyISAMSupport: YESComment: MyISAM storage engine
Transactions: NOXA: NOSavepoints: NO
...
本章介紹專用MySQL存儲引擎的用例。
它不包括“InnoDB存儲引擎”和“MySQL NDB Cluster 8.0”中涵蓋的默認InnoDB存儲引擎或NDB存儲存儲引擎。
對于高級用戶,它還包含可插拔存儲引擎架構的描述
(請參閱“MySQL存儲引擎架構概述”)。
有關商業MySQL Server二進制文件中提供的功能的信息,請參閱MySQL網站上的MySQL 版本。可用的存儲引擎可能取決于您使用的MySQL版本。
有關MySQL存儲引擎常見問題的答案,請參閱“MySQL 8.0常見問題解答:存儲引擎”。
1.MySQL 8.0支持的存儲引擎
1.1 InnoDB
????????MySQL 8.0中的默認存儲引擎。InnoDB是MySQL的事務安全(ACID兼容)存儲引擎,具有提交、回滾和崩潰恢復功能,可保護用戶數據。InnoDB行級鎖定(不升級到更粗粒度的鎖定)和Oracle風格的一致非鎖定讀取提高了多用戶并發性和性能。InnoDB將用戶數據存儲在集群索引中,以減少基于主鍵的常見查詢的I/O。為了保持數據完整性,InnoDB還支持FOREIGN KEY引用完整性約束。
有關InnoDB的更多信息,請參閱"InnoDB存儲引擎"。
1.2 MyISAM
????????這些表占用空間很小。表級鎖定限制了讀/寫工作負載的性能,因此它通常用于Web和數據倉庫配置中的只讀或只讀工作負載。
1.3 Memory
????????將所有數據存儲在RAM中,以便在需要快速查找非關鍵數據的環境中快速訪問。這種發動機以前被稱為HEAP發動機。其使用案例正在減少;InnoDB及其緩沖池內存區域提供了一種通用且持久的方式來將大部分或所有數據保存在內存中,NDBCLUSTER為巨大的分布式數據集提供了快速的鍵值查找。
1.4 CSV
????????它的表實際上是具有逗號分隔值的文本文件。CSV表允許您以CSV格式導入或轉儲數據,以便與讀取和寫入相同格式的腳本和應用程序交換數據。因為CSV表沒有索引,所以通常在正常操作期間將數據保存在InnoDB表中,并且僅在導入或導出階段使用CSV表。
1.5 Archive
????????這些緊湊、無索引的表用于存儲和檢索大量很少被引用的歷史、歸檔或安全審計信息。
1.6 Blackhole
????????黑洞存儲引擎接受但不存儲數據,類似于Unix/dev/null設備。查詢總是返回一個空集。這些表可以用于復制配置,其中DML語句被發送到副本服務器,但源服務器不保留自己的數據副本。
1.7 NDB
????????(也稱為NDBCLUSTER)這種集群數據庫引擎特別適合于需要盡可能高的正常運行時間和可用性的應用程序。
1.8 Merge
????????使MySQL DBA或開發人員能夠對一系列相同的MyISAM表進行邏輯分組,并將它們作為一個對象引用。適用于VLDB環境,如數據倉庫。
1.9 Federated
????????提供鏈接獨立MySQL服務器的能力,以從多個物理服務器創建一個邏輯數據庫。非常適合分布式或數據集市環境。
1.10 Example
????????此引擎是MySQL源代碼中的一個示例,說明了如何開始編寫新的存儲引擎。它主要是開發者感興趣的。存儲引擎是一個什么都不做的“存根”。您可以使用此引擎創建表,但不能將任何數據存儲在表中或從表中檢索數據。
2.選擇存儲引擎
????????MySQL提供的各種存儲引擎在設計時考慮到了不同的用例。下表概述了MySQL提供的一些存儲引擎,并在下表中進行了說明。
Feature | MyISAM | Memory | InnoDB | Archive | NDB |
---|---|---|---|---|---|
B-tree索引 | Yes | Yes | Yes | No | No |
備份/時間點恢復(note 1) | Yes | Yes | Yes | Yes | Yes |
集群支持 | No | No | No | No | Yes |
聚集索引 | No | No | Yes | No | No |
壓縮數據 | Yes (note 2) | No | Yes | Yes | No |
數據緩存 | No | N/A | Yes | No | Yes |
加密數據 | Yes (note 3) | Yes (note 3) | Yes (note 4) | Yes (note 3) | Yes (note 5) |
外鍵支持 | No | No | Yes | No | Yes |
全文搜索索引 | Yes | No | Yes (note 6) | No | No |
地理空間數據類型支持 | Yes | No | Yes | Yes | Yes |
地理空間索引支持 | Yes | No | Yes (note 7) | No | No |
哈希索引 | No | Yes | No (note 8) | No | Yes |
索引緩存 | Yes | N/A | Yes | No | Yes |
鎖定粒度 | Table | Table | Row | Row | Row |
MVCC | No | No | Yes | No | No |
復制支持(note 1) | Yes | Limited (note 9) | Yes | Yes | Yes |
存儲限制 | 256TB | RAM | 64TB | None | 384EB |
T樹索引 | No | No | No | No | Yes |
事務 | No | No | Yes | No | Yes |
更新數據字典的統計信息 | Yes | Yes | Yes | Yes | Yes |
note:
1.在服務器中實現,而不是在存儲引擎中實現。
2.只有在使用壓縮行格式時,才支持壓縮的MyISAM表。使用MyISAM壓縮行格式的表是只讀的。
3.通過加密功能在服務器中實現。
4.通過加密功能在服務器中實現;在MySQL 5.7及更高版本中,支持靜態數據加密。
5.通過加密功能在服務器中實現;截至NDB 8.0.22支持加密NDB備份;NDB 8.0.29及更高版本支持透明NDB文件系統加密。
6.MySQL 5.6及更高版本提供了對FULLTEXT索引的支持。
7.MySQL 5.7及更高版本提供了對地理空間索引的支持。
8.InnoDB的自適應哈希索引功能在內部使用哈希索引。