MySQL 中的儲存引擎是其資料庫管理系統的核心模組,用於處理不同型別的資料儲存和檢索操作。每種儲存引擎都有自己的特點,適用於不同型別的應用場景。MySQL 最常用的儲存引擎包括 InnoDB、MyISAM、Memory、CSV、Archive、Merge、Federated、NDB 等。以下是對 MySQL 儲存引擎的詳細介紹。
1. InnoDB 儲存引擎
主要特點:
- 事務支援:InnoDB 是 MySQL 中預設的儲存引擎,支援完整的 ACID 事務(Atomicity, Consistency, Isolation, Durability)特性。它還提供了事務的隔離級別,可以防止髒讀、不可重複讀、幻讀等問題。
- 行級鎖定:InnoDB 使用行級鎖定(Row-level Locking),這使得它非常適合高併發的寫操作,鎖衝突的機率較小。
- 外來鍵支援:InnoDB 支援外來鍵約束,因此可以在表與表之間定義資料的依賴關係,並自動維護參照完整性。
- 崩潰恢復:InnoDB 透過使用 重做日誌(Redo Logs) 和 撤銷日誌(Undo Logs) 來保證在系統崩潰時的資料恢復能力。
- 聚簇索引:InnoDB 使用聚簇索引(Clustered Index),主鍵索引和資料儲存在一起。每個表必須有一個主鍵,如果沒有定義主鍵,InnoDB 會自動生成一個隱藏的主鍵。
適用場景:
InnoDB 非常適合處理需要高併發的事務系統,例如:
- 銀行交易系統:涉及到大量的插入、更新操作,並且需要保證事務的完整性和隔離性。
- 電子商務平臺:需要頻繁的訂單插入和庫存更新,並保證資料一致性。
工作機制(底層實現):
- 資料儲存結構:InnoDB 將表儲存在一個邏輯的表空間中,預設情況下使用共享表空間
ibdata
檔案,也可以每個表單獨儲存在自己的.ibd
檔案中。 - 緩衝池(Buffer Pool):InnoDB 透過快取資料頁的方式,減少磁碟 I/O 操作。修改操作首先會被寫入緩衝池,隨後非同步地重新整理到磁碟。
- 雙寫緩衝(Doublewrite Buffer):為了防止在崩潰或斷電時資料部分寫入磁碟導致的損壞,InnoDB 將資料頁寫入兩次,確保資料完整。
2. MyISAM 儲存引擎
主要特點:
- 不支援事務:MyISAM 不支援事務和外來鍵,因此不能保證資料的完整性和一致性。
- 表級鎖定:MyISAM 使用表級鎖定(Table-level Locking),對於讀操作鎖定整個表,寫操作也是如此。這使得 MyISAM 的併發效能較差,尤其是在頻繁寫入的場景。
- 全文索引支援:MyISAM 支援全文索引(Full-text Index),可以用於高效的全文搜尋操作。
- 較小的儲存空間:MyISAM 的儲存格式緊湊,對於儲存靜態資料或日誌資料有一定的優勢。
- 速度快:由於其不需要事務控制、外來鍵支援等功能,MyISAM 在只讀或讀多寫少的場景下效能非常好。
適用場景:
- 只讀資料庫:用於靜態資料儲存,且更新頻率低的場景。例如,資料倉儲 或 日誌儲存系統。
- 全文搜尋:需要對文字進行快速全文搜尋的場景。
工作機制(底層實現):
- 資料和索引分離儲存:MyISAM 將資料儲存在
.MYD
檔案中,索引儲存在.MYI
檔案中。 - 表鎖機制:對於 MyISAM,讀取操作可以併發進行,但一旦有寫操作,整個表會被鎖定。寫入時會阻塞所有其他的讀操作。
- 不支援崩潰恢復:與 InnoDB 不同,MyISAM 不支援崩潰恢復,一旦系統崩潰可能導致資料丟失或不一致。
3. Memory 儲存引擎
主要特點:
- 資料儲存在記憶體中:Memory 儲存引擎的資料是臨時儲存在記憶體中的,重啟資料庫或關閉會話後,所有資料都會丟失。
- 表級鎖定:和 MyISAM 一樣,Memory 引擎使用表級鎖定。
- 速度快:由於資料完全儲存在記憶體中,Memory 引擎的讀寫速度非常快。
- 不支援 BLOB 和 TEXT 型別:由於記憶體的限制,Memory 引擎不支援大物件型別,如 BLOB 和 TEXT 型別。
適用場景:
- 臨時資料處理:Memory 引擎適合用於臨時資料處理、快取資料等。例如,臨時表 或 會話資料儲存。
- 快速查詢結果儲存:需要高效快速查詢但不需要持久化的場景。
工作機制(底層實現):
- 記憶體儲存結構:Memory 引擎將資料儲存在記憶體中,使用雜湊索引(Hash Index),以提供更快速的查詢效能。
- 資料丟失風險:由於資料儲存在記憶體中,一旦伺服器重啟或關閉,所有資料都會消失。
4. CSV 儲存引擎
主要特點:
- 文字儲存:CSV 引擎將資料儲存為逗號分隔值的文字檔案,類似於傳統的 CSV 檔案。
- 簡單結構:每張表的資料都會被儲存在一個
.csv
檔案中。 - 不支援索引:CSV 引擎不支援索引,因此查詢效能較差。
- 便於匯入和匯出:由於其儲存格式是標準的 CSV 檔案,便於與外部系統進行資料交換。
適用場景:
- 資料匯入和匯出:在需要與其他系統交換資料時,CSV 儲存引擎是一個很好的選擇。
- 臨時資料儲存:對於需要簡單格式且不需要索引的資料儲存場景,可以使用 CSV。
5. Archive 儲存引擎
主要特點:
- 適合大規模資料儲存:Archive 儲存引擎專門設計用於高效地儲存大量的歷史資料或歸檔資料。
- 支援插入和查詢:Archive 只支援插入操作和查詢操作,不支援更新和刪除操作。
- 資料壓縮:Archive 引擎會將資料進行壓縮儲存,從而減少磁碟佔用。
- 表級鎖定:Archive 使用表級鎖定。
適用場景:
- 日誌系統:Archive 儲存引擎非常適合儲存日誌資料,歷史歸檔資料等,資料儲存空間有限的場景。
6. 其他儲存引擎
- Merge:合併多個 MyISAM 表,可以將多個相同結構的 MyISAM 表合併為一個邏輯表,常用於分割槽資料管理。
- Federated:用於分散式資料庫系統,可以在不同 MySQL 例項之間進行跨伺服器查詢。
- NDB Cluster:用於 MySQL Cluster 配置,分散式、容錯的儲存引擎,常用於高可用系統。
總結
儲存引擎 | 主要特點 | 適用場景 |
---|---|---|
InnoDB | 支援事務、行級鎖定、外來鍵支援 | 高併發事務系統(如銀行、電子商務平臺) |
MyISAM | 不支援事務、表級鎖定、全文索引支援 | 靜態資料儲存、讀多寫少的系統 |
Memory | 資料儲存在記憶體中,速度快 | 臨時資料處理、快取、會話管理 |
CSV | 資料儲存為文字檔案,便於資料交換 | 資料匯入匯出場景 |
Archive | 只支援插入和查詢,資料壓縮 | 日誌資料儲存、大規模歷史資料歸檔 |
Merge | 合併多個 MyISAM 表 | 分割槽資料管理 |
Federated | 分散式資料庫系統,跨伺服器查詢 | 需要與其他 MySQL 例項互動的系統 |