innoDB是mysql的默認事務型引擎,也是最重要,使用最廣泛的存儲引擎。它被設計來處理大量的短期事務,短期事務大部分情況是正常提交的,很少會被回滾。innodb的性能和自動崩潰回復特性,使得它在非事務型存儲的需求中也很流行。除非有非常特別的原因需要使用其他的存儲引擎,否則應該優先考慮innodb存儲引擎
innodb的數據存儲在表空間中,表空間是由innodb管理的一個黑盒子,由一系列的數據文件組成。在mysql4.1以後的版本中,innodb可以將每個表的數據和索引存放在單獨的文件中。innodb也可以使用裸設備作為表空間的存儲介質,但現代的文件系統使得裸設備不再是必要選擇。
innodb采用mvcc來支持高並發,並且實現了四個標准的隔離級別。其默認級別是repeatable read(可重復度),並且通過間隙鎖策略防止幻讀的出現。間隙鎖使得innodb不僅僅鎖定查詢涉及的行,還會對索引中的間隙進行鎖定,以防止幻影行的插入
innodb 表是基於聚簇索引建立的,聚簇索引對主鍵查詢有很高的性能。不過它的二級索引中必須包含主鍵列,所以如果主鍵列很大的話,其他的索引都會很大
在mysql 5.1及之前的版本,myisam是默認的存儲引擎。myisam提供了大量的特性,包括全文索引,壓縮,空間函數(GIS)等,但myisam不支持事務和行級鎖且有一個毫無疑問的缺陷就是崩潰後無法安全恢復。正是由於myisam引擎的緣故,即使mysql支持事務已經很長時間了,在很多人的概念中mysql還是非事務性的數據庫。盡管myisam引擎不支持事務,不支持崩潰後的安全回復,但它絕不是一無是處的。對於只讀的數據,或者表比較小,可以忍受修復操作,則依然可以繼續使用myisam。
myisam會將表存儲在兩個文件中:數據文件和索引文件,分別以.myd和.myi為拓展名。myisam表可以包含動態或者靜態長度固定的行。mysql會根據表的定義來決定采用何種行格式。myisam表可以存儲的行記錄數,一般受限於可用磁盤控件,或者操作系統中單個文件的最大尺寸。
myisam對整張表進行加鎖,而不是針對行。讀取時會對需要讀到的所有表加共享鎖,寫入時則對表加排他鎖。但是在表有讀取查詢的時候,也可以往表中插入新的記錄,這被稱為並發插入。
對與myisam表,mysql可以手工或者自動執行檢查和修復操作,但這裡說的修復和事務回復以及崩潰恢復是不同的概念。執行表的修復可能導致一些數據丟失,而且修復操作是非常慢的。可以通過check table mytable檢查表的錯誤,如果有錯誤可以通過執行repair table mytable進行修復。另外,如果mysql服務器已經關閉,可以通過myisamchk命令行工具進行檢查和修復操作。
對於myisam表,即使是blob和text等長字段,也可以基於其前500個字符創建索引,myisam也支持全文索引,這是一種基於分詞創建的索引,可以支持復雜的查詢。
創建myisam表的時候,如果指定了delay_key_write選項,在每次修改執行完成時,不會立刻將修改的索引數據寫入磁盤,而是會寫到內存中的鍵緩沖區,只有在清理鍵緩沖區或者關閉表的時候才會將對應的索引塊寫入到磁盤。這種方式可以極大的提升寫入性能,但是在數據或者主機崩潰時會造成索引損壞,需要執行修復操作。延遲更新索引的操作,可以在全局設置,也可以為單個表設置