1. 程式人生 > >1.5 MySQL的存儲引擎

1.5 MySQL的存儲引擎

之前 簡單 索引數據 db集群 需要 適應 black inno nbsp

InnoDB:

InnoDB是 MySQL 默認的事務型存儲引擎,也是最重要、使用最廣泛的存儲引擎。只有在需要它不支持的特性時,才考慮使用其它存儲引擎。被設計用來處理大量的短期事務,短期事務大部分情況是正常提交的,很少會被回滾。

InnoDB采用多版本並發控制(MVCC)來支持高並發,並且實現了四個標準的隔離級別,默認級別是可重復讀(REPEATABLE READ)。在可重復讀隔離級別下,通過多版本並發控制(MVCC)+ 間隙鎖(Next-Key Locking)防止幻影讀。間隙鎖使得InnoDB不僅僅鎖定查詢涉及的行,還會對索引中的間隙進行鎖定,以防止幻影行的插入。

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

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

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

MyISAM:

在MySQL5.1及之前的版本,MyISAM是默認的存儲引擎。

設計簡單,數據以緊密格式存儲。對於只讀數據,或者表比較小、可以容忍修復(repair)操作,則依然可以繼續使用它(但請不要默認使用MyISAM,而是應當默認使用InnoDB)。

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

不支持事務,不支持崩潰後的安全恢復。

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

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

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

比較:

  • 事務:InnoDB 是事務型的,可以使用 Commit 和 Rollback 語句,而MyISAM 不支持事務。

  • 並發:MyISAM 只支持表級鎖,而 InnoDB 還支持行級鎖。

  • 外鍵:InnoDB 支持外鍵。

  • 備份:InnoDB 支持在線熱備份。

  • 崩潰恢復:MyISAM 崩潰後發生損壞的概率比 InnoDB 高很多,而且恢復的速度也更慢。

  • 其它特性:MyISAM 支持壓縮表和空間數據索引。

MySQL內建的其他存儲引擎:

Archive引擎、Blackhole引擎、CSV引擎、Federated引擎、Memory引擎、Merge引擎、NDB集群引擎

1.5 MySQL的存儲引擎