目錄
儲存引擎是 MySQL 組件,負責處理不同資料表類型的 SQL 操作。InnoDB
是預設且最通用的儲存引擎,Oracle 建議除了特殊用途案例外,資料表都應使用它。(MySQL 9.0 中的 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 9.0》中介紹。對於進階使用者,它還包含可插拔儲存引擎架構的描述(請參閱第 18.11 節〈MySQL 儲存引擎架構概觀〉)。
如需有關商業 MySQL 伺服器二進位檔中提供的功能的資訊,請參閱 MySQL 網站上的MySQL 版本。可用的儲存引擎可能取決於您使用的 MySQL 版本。
如需關於 MySQL 儲存引擎的常見問題解答,請參閱第 A.2 節〈MySQL 9.0 常見問題:儲存引擎〉。
MySQL 9.0 支援的儲存引擎
InnoDB
:MySQL 9.0 中的預設儲存引擎。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. 請參閱本節稍後的討論。