前言
存儲引擎在MySQL的邏輯架構中位於第三層,負責MySQL中的數據的存儲和提取。MySQL存儲引擎有很多,不同的存儲引擎保存數據和索引的方式是不同的。每一種存儲引擎都有它的優勢和劣勢,本文只討論最常見的InnoDB和MyISAM兩種存儲引擎進行討論。
InnoDB存儲引擎
InnoDB是默認的事務型存儲引擎,也是最重要,使用最廣泛的存儲引擎。在沒有特殊情況下,一般優先使用InnoDB存儲引擎。
1. 數據存儲形式:
使用InnoDB時,會將數據表分爲.frm 和 idb兩個文件進行存儲。
2、鎖的粒度
InnoDB採用MVCC(多版本併發控制)來支持高併發,InnoDB實現了四個隔離級別,默認級別是REPETABLE READ,並通過間隙鎖策略防止幻讀的出現。它的鎖粒度是行鎖。
3、事務
InnoDB是典型的事務型存儲引擎,並且通過一些機制和工具,支持真正的熱備份。
4、數據的存儲特點
InnoDB表是基於聚簇索引(另一篇博客有介紹)建立的,聚簇索引對主鍵的查詢有很高的性能,不過他的二級索引(非主鍵索引)必須包含主鍵列,索引其他的索引會很大。
更深入的瞭解: MySQL索引實現原理分析
MyISAM存儲引擎
1、數據存儲形式
MyISAM採用的是索引與數據分離的形式,將數據保存在三個文件中.frm.MYD,.MYIs。
2、鎖的粒度
MyISAM不支持行鎖,所以讀取時對錶加上共享鎖,在寫入是對錶加上排他鎖。由於是對整張表加鎖,相比InnoDB,在併發寫入時效率很低。
3、事務
MyISAM不支持事務。
4、數據的存儲特點
MyISAM是基於非聚簇索引進行存儲的。
更深入的瞭解: MySQL索引實現原理分析
5、其他
MyISAM提供了大量的特性,包括全文索引,壓縮,空間函數,延遲更新索引鍵等。
進行壓縮後的表是不能進行修改的,但是壓縮表可以極大減少磁盤佔用空間,因此也可以減少磁盤IO,從而提供查詢性能。
全文索引,是一種基於分詞創建的索引,可以支持複雜的查詢。
延遲更新索引鍵,不會將更新的索引數據立即寫入到磁盤,而是會寫到內存中的緩衝區中,只有在清除緩衝區時候纔會將對應的索引寫入磁盤,這種方式大大提升了寫入性能。
三、對比與選擇
兩種存儲引擎各有各的有點,MyISAM專注性能,InnoDB專注事務。兩者最大的區別就是InnoDB支持事務,和行鎖。
如何在兩種存儲引擎中進行選擇?
① 是否有事務操作?有,InnoDB。
②是否存儲併發修改?有,InnoDB。
③是否追求快速查詢,且數據修改較少?是,MyISAM。
④是否使用全文索引?如果不引用第三方框架,可以選擇MyISAM,但是可以選用第三方框架和InnDB效率會更高。