目錄
儲存引擎是 MySQL 組件,負責處理不同資料表類型的 SQL 操作。InnoDB
是預設且最通用的儲存引擎,Oracle 建議在特殊使用案例之外的資料表都使用它。(MySQL 8.4 中的 CREATE TABLE
陳述式預設會建立 InnoDB
資料表。)
MySQL 伺服器使用可外掛的儲存引擎架構,讓儲存引擎能夠載入和卸載至執行中的 MySQL 伺服器。
若要判斷您的伺服器支援哪些儲存引擎,請使用 SHOW ENGINES
陳述式。Support
欄位中的值會指出是否可以使用引擎。YES
、NO
或 DEFAULT
的值表示引擎可用、不可用或可用且目前設定為預設儲存引擎。
mysql> SHOW ENGINES\G
*************************** 1. row ***************************
Engine: PERFORMANCE_SCHEMA
Support: YES
Comment: Performance Schema
Transactions: NO
XA: NO
Savepoints: NO
*************************** 2. row ***************************
Engine: InnoDB
Support: DEFAULT
Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
XA: YES
Savepoints: YES
*************************** 3. row ***************************
Engine: MRG_MYISAM
Support: YES
Comment: Collection of identical MyISAM tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 4. row ***************************
Engine: BLACKHOLE
Support: YES
Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
XA: NO
Savepoints: NO
*************************** 5. row ***************************
Engine: MyISAM
Support: YES
Comment: MyISAM storage engine
Transactions: NO
XA: NO
Savepoints: NO
...
本章涵蓋特殊用途 MySQL 儲存引擎的使用案例。它不涵蓋預設的 InnoDB
儲存引擎或 NDB
儲存引擎,這些引擎分別在 第 17 章,InnoDB 儲存引擎 和 第 25 章,MySQL NDB Cluster 8.4 中涵蓋。對於進階使用者,它也包含可外掛儲存引擎架構的說明(請參閱 18.11 節,「MySQL 儲存引擎架構概述」)。
如需商用 MySQL 伺服器二進位檔中提供的功能相關資訊,請參閱 MySQL 網站上的 MySQL 版本。可用的儲存引擎可能取決於您使用的 MySQL 版本。
如需有關 MySQL 儲存引擎的常見問題解答,請參閱 A.2 節,「MySQL 8.4 常見問題:儲存引擎」。
MySQL 8.4 支援的儲存引擎
InnoDB
:MySQL 8.4 中的預設儲存引擎。InnoDB
是用於 MySQL 的交易安全(符合 ACID)儲存引擎,具有提交、回滾和損毀復原功能,可保護使用者資料。InnoDB
的資料列層級鎖定(不會升級至較粗略的鎖定粒度)和 Oracle 風格的一致非鎖定讀取,可提高多使用者並行性和效能。InnoDB
將使用者資料儲存在叢集索引中,以減少基於主索引鍵的常見查詢的 I/O。為了維護資料完整性,InnoDB
也支援FOREIGN KEY
參考完整性約束。如需關於InnoDB
的詳細資訊,請參閱 第 17 章,InnoDB 儲存引擎。MyISAM
:這些資料表的佔用空間很小。資料表層級鎖定會限制讀取/寫入工作負載的效能,因此它通常用於 Web 和資料倉儲組態中的唯讀或幾乎唯讀工作負載。Memory
:將所有資料儲存在 RAM 中,以便在需要快速查詢非關鍵資料的環境中快速存取。此引擎以前稱為HEAP
引擎。它的使用案例正在減少;具有緩衝池記憶體區域的InnoDB
提供了一種通用的持久方式,可將大部分或所有資料保留在記憶體中,而NDBCLUSTER
為巨大的分散式資料集提供了快速的鍵值查詢。CSV
:其資料表實際上是具有逗號分隔值的文字檔。CSV 資料表可讓您匯入或轉儲 CSV 格式的資料,以與讀取和寫入相同格式的指令碼和應用程式交換資料。由於 CSV 資料表未建立索引,因此您通常會在正常操作期間將資料保留在InnoDB
資料表中,並且僅在匯入或匯出階段使用 CSV 資料表。Archive
:這些緊湊、未建立索引的資料表,旨在儲存和擷取大量很少參考的歷史、封存或安全性稽核資訊。Blackhole
:Blackhole 儲存引擎會接受但不儲存資料,類似於 Unix 的/dev/null
裝置。查詢始終會傳回空的集合。這些資料表可以用於將 DML 陳述式傳送至複本伺服器的複寫組態中,但來源伺服器不會保留其自己的資料副本。NDB
(也稱為NDBCLUSTER
):此叢集式資料庫引擎特別適合需要最高程度的執行時間和可用性的應用程式。Merge
:讓 MySQL DBA 或開發人員能夠以邏輯方式將一系列相同的MyISAM
資料表分組,並將它們參照為一個物件。適用於 VLDB 環境,例如資料倉儲。Federated
:提供連結單獨 MySQL 伺服器的能力,以從多個實體伺服器建立一個邏輯資料庫。非常適用於分散式或資料超市環境。Example
:此引擎作為 MySQL 原始碼中的範例,說明如何開始撰寫新的儲存引擎。它主要供開發人員感興趣。儲存引擎是個「“虛設常式”」,什麼也不做。您可以使用此引擎建立資料表,但無法在其中儲存或擷取任何資料。
您不限於對整個伺服器或結構描述使用相同的儲存引擎。您可以指定任何資料表的儲存引擎。例如,應用程式可能主要使用 InnoDB
資料表,其中一個 CSV
資料表用於將資料匯出至試算表,以及一些 MEMORY
資料表用於暫時的工作區。
選擇儲存引擎
MySQL 提供的各種儲存引擎在設計時考慮了不同的使用情境。下表概述了 MySQL 提供的一些儲存引擎,並在表格後附帶說明。
表 18.1 儲存引擎功能摘要
功能 | MyISAM | Memory | InnoDB | Archive | NDB |
---|---|---|---|---|---|
B 樹索引 | 是 | 是 | 是 | 否 | 否 |
備份/時間點復原(註 1) | 是 | 是 | 是 | 是 | 是 |
叢集資料庫支援 | 否 | 否 | 否 | 否 | 是 |
叢集索引 | 否 | 否 | 是 | 否 | 否 |
壓縮資料 | 是(註 2) | 否 | 是 | 是 | 否 |
資料快取 | 否 | 不適用 | 是 | 否 | 是 |
加密資料 | 是(註 3) | 是(註 3) | 是(註 4) | 是(註 3) | 是(註 5) |
外鍵支援 | 否 | 否 | 是 | 否 | 是 |
全文檢索索引 | 是 | 否 | 是(註 6) | 否 | 否 |
地理空間資料類型支援 | 是 | 否 | 是 | 是 | 是 |
地理空間索引支援 | 是 | 否 | 是(註 7) | 否 | 否 |
雜湊索引 | 否 | 是 | 否(註 8) | 否 | 是 |
索引快取 | 是 | 不適用 | 是 | 否 | 是 |
鎖定粒度 | 表格 | 表格 | 列 | 列 | 列 |
MVCC | 否 | 否 | 是 | 否 | 否 |
複製支援(註 1) | 是 | 有限制(註 9) | 是 | 是 | 是 |
儲存限制 | 256TB | RAM | 64TB | 無 | 384EB |
T 樹索引 | 否 | 否 | 否 | 否 | 是 |
交易 | 否 | 否 | 是 | 否 | 是 |
更新資料字典統計資訊 | 是 | 是 | 是 | 是 | 是 |
註解
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 在其自適應雜湊索引功能中內部使用雜湊索引。
9. 請參閱本節稍後的討論。