InnoDB與MyISAM總結和對比
Mysql的數據庫引擎在我的博客中曾經有過陳述,但只是對所有引擎的一個簡單敘述,而InnoDB與MyISAM數據庫引擎是我們平時使用最多的,有必要進行詳細全面的介紹和對比,以便我們在選擇數據庫引擎時能夠根據需求更好地選擇。
InnoDB
特點:
支持ACID事務(具有提交,回滾和崩潰恢復能力),支持存儲過程,視圖,支持行級鎖定,支持外鍵,處理巨大數據量時擁有最大性能(可以說它的CPU效率是其他基於磁盤關系數據庫引擎所不能匹敵的),表可以是任何尺寸,不支持全文類型的索引,插入緩沖、二次寫、自適應哈希索引(三個特性詳細介紹見: InnoDB的三個關鍵特性 (http://blog.csdn.net/z702143700/article/details/46049101)。
應用場景:
以INSERT、UPDATE為主的應用。 在需要高性能的大型數據庫的應用中。 更新密集的表。InnoDB存儲引擎特別適合處理多重並發的更新請求。 事務。InnoDB存儲引擎是支持事務的標准MySQL存儲引擎。 自動災難恢復。與其它存儲引擎不同,InnoDB表能夠自動從災難中恢復。 外鍵約束。MySQL支持外鍵的存儲引擎只有InnoDB。 支持自動增加列AUTO_INCREMENT屬性。
注:InnoDB表的行鎖也不是絕對的,如果在執行一個SQL語句時MySQL不能確定要掃描的范圍,InnoDB表同樣會鎖全表,例如update table set num=1 where name like “%aaa%”,select count(*) 、order by等也會鎖表。而行級鎖,一般只在涉及到索引的時候才會被使用。
比如:where條件中含索引字段時,就是行鎖。其他情況都是表鎖。
MyISAM
特點:
較高的查詢速度,表級鎖定;BLOB和TEXT列可以被索引;不支持事務,不支持外鍵;支持全文索引,支持3種不同的存儲格式:靜態(固定長度)表、動態表、壓縮表;
靜態表是默認的存儲格式。靜態表中的字段都是非變長字段,這樣每個記錄都是固定長度的,這種存儲方式的優點是存儲非常迅速,容易緩存,出現故障容易恢復;缺點是占用的空間通常比動態表多。靜態表在數據存儲時會根據列定義的寬度定義補足空格,但是在訪問的時候並不會得到這些空格,這些空格在返回給應用之前已經去掉。同時需要注意:在某些情況下可能需要返回字段後的空格,而使用這種格式時後面到空格會被自動處理掉。
動態表包含變長字段,記錄不是固定長度的,這樣存儲的優點是占用空間較少,但是頻繁到更新刪除記錄會產生碎片,需要定期執行OPTIMIZE TABLE語句或myisamchk -r命令來改善性能,並且出現故障的時候恢復相對比較困難。
壓縮表由myisamchk工具創建,占據非常小的空間,因為每條記錄都是被單獨壓縮的,所以只有非常小的訪問開支。
應用場景:
對事務完整性沒有要求或者以SELECT為主的應用。 無事務要求,但對效率要求比較高的應用。
注:NULL值被允許在索引的列中,這個占每個鍵的0-1個字節。
InnoDB和MyISAM對比:
InnoDB可以利用事務日志進行數據恢復,這會比較快。而MyISAM可能會需要幾個小時甚至幾天來干這些事,InnoDB 只需要幾分鐘。但是在某些場景MyISAM似乎更方便高效,因為它可以直接拷貝frm.MYD,MYI文件,然後在對於版本的數據中啟動就可以使用了。比如,數據表損壞,遷移,還原數據只要拷貝文件就可以了。而InnoDB要考慮字典數據的影響,拷貝文件的方式無效,如果導出.sql文件,會耗費大量的時間。 InnoDB 中不保存表的具體行數,也就是說,執行select count(
) from table時,InnoDB要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出保存好的行數即可。注意的是,當count()語句包含 where條件時,兩種表的操作是一樣的。 對於AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中,可以和其他字段一起建立聯合索引。 DELETE FROM table時,InnoDB不會重新建立表,而是一行一行的刪除。 LOAD TABLE FROM MASTER操作對InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,導入數據後再改成InnoDB表,但是對於使用的額外的InnoDB特性(例如外鍵)的表不適用。 MyISAM的索引和數據是分開的,並且索引是有壓縮的,內存使用率就對應提高了不少。能加載更多索引,而Innodb是索引和數據是緊密捆綁的,沒有使用壓縮從而會造成Innodb比MyISAM體積龐大不小。 InnoDB存儲引擎為在主內存中緩存數據和索引而維持它自己的緩沖池。 MyISAM表是使用B型樹索引,MyISAM索引文件和數據文件是分離的,索引文件僅保存數據記錄的地址,也叫做“非聚集索引”。 InnoDB也使用B+Tree作為索引結構,這棵樹的葉節點data域保存了完整的數據記錄。它的索引的key是數據表的主鍵,因此InnoDB表數據文件本身就是主索引,也叫做“聚集索引”。