MySQL必知存儲引擎

  • 2020 年 2 月 24 日
  • 筆記

Mysql存儲引擎

1.MyISAM MySQL 5.0 之前的默認資料庫引擎,最為常用。擁有較高的插入,查詢速度,但不支援事務.

2.InnoDB事務型資料庫的首選引擎,支援ACID事務,支援行級鎖定, MySQL 5.5 起成為默認資料庫引擎.

3.BDB源 自 Berkeley DB,事務型資料庫的另一種選擇,支援Commit 和Rollback 等其他事務特性

4.Memory所有數據置於記憶體的存儲引擎,擁有極高的插入,更新和查詢效率。但是會佔用和數據量成正比的記憶體空間。並且其內容會在 MySQL 重新啟動時丟失

5.Merge將一定數量的 MyISAM 表聯合而成一個整體,在超大規模數據存儲時很有用

6.Archive非常適合存儲大量的獨立的,作為歷史記錄的數據。因為它們不經常被讀取。Archive 擁有高效的插入速度,但其對查詢的支援相對較差

7.Federated將不同的 MySQL 伺服器聯合起來,邏輯上組成一個完整的資料庫。非常適合分散式應用

8.Cluster/NDB高冗餘的存儲引擎,用多台數據機器聯合提供服務以提高整體性能和安全性。適合數據量大,安全和性能要求高的應用

9.CSV 邏輯上由逗號分割數據的存儲引擎。它會在資料庫子目錄里為每個數據表創建一個 .csv 文件。這是一種普通文本文件,每個數據行佔用一個文本行。CSV 存儲引擎不支援索引。

10.BlackHole 黑洞引擎,寫入的任何數據都會消失,一般用於記錄 binlog 做複製的中繼

11.EXAMPLE 存儲引擎是一個不做任何事情的存根引擎。它的目的是作為 MySQL 源程式碼中的一個例子,用來演示如何開始編寫一個新存儲引擎。同樣,它的主要興趣是對開發者。EXAMPLE 存儲引擎不支援編索引。另外,MySQL 的存儲引擎介面定義良好。有興趣的開發者可以通過閱讀文檔編寫自己的存儲引擎。

InnoDB

InnoDB是MySQL默認的事務型存儲引擎,只有在需要他不支援的特性時,才考慮使用期它存儲引擎。

實現了四個標準的隔離級別,默認級別是可重複讀(REPEATABLE READ).在可重複讀隔離級別下,通過多版本並發控制(MVCC)+Next-Key Locking防止幻讀。

主索引是聚簇索引,在索引中保存了數據,從而避免直接讀取磁碟,因此對查詢性能有很大的提升。

內部做了很多優化,包括從磁碟讀取數據時採用的可預測性讀、能夠加快讀操作並且自動創建的自適應哈希索引、能夠加速插入操作的插入緩衝區等。

支援真正的在線熱備份。其它存儲引擎不支援在線熱備份,要獲取一致性視圖需要停止對所有表的寫入,而在讀寫混合場景中,停止寫入可能也意味著停止讀取。

MyISAM

設計簡單,數據以緊密格式存儲。對於只讀數據,或者表比較小、可以容忍修復操作,則依然可以使用它。

提供了大量的特性,包括壓縮表、空間數據索引等。

不支援事務。

不支援行級鎖,只能對整張表加鎖,讀取時會對需要讀到的所有表加共享鎖,寫入時則對錶加排它鎖。但在表有讀取操作的同時,也可以往表中插入新的記錄,這被稱為並發插入(CONCURRENT INSERT)。

可以手工或者自動執行檢查和修復操作,但是和事務恢復以及崩潰恢復不同,可能導致一些數據丟失,而且修復操作是非常慢的。

如果指定了 DELAY_KEY_WRITE 選項,在每次修改執行完成時,不會立即將修改的索引數據寫入磁碟,而是會寫到記憶體中的鍵緩衝區,只有在清理鍵緩衝區或者關閉表的時候才會將對應的索引塊寫入磁碟。這種方式可以極大的提升寫入性能,但是在資料庫或者主機崩潰時會造成索引損壞,需要執行修復操作。

比較

  • 事務:InnoDB 是事務型的,可以使用 Commit 和 Rollback 語句。
  • 並發:MyISAM 只支援表級鎖,而 InnoDB 還支援行級鎖。
  • 外鍵:InnoDB 支援外鍵。
  • 備份:InnoDB 支援在線熱備份。
  • 崩潰恢復:MyISAM 崩潰後發生損壞的概率比 InnoDB 高很多,而且恢復的速度也更慢。
  • 其它特性:MyISAM 支援壓縮表和空間數據索引。