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表資料檔案本身就是主索引,也叫做“聚集索引”。MyISAM和InnoDB索引實作詳細對比 ,見部落格http://blog.csdn.net/z702143700/article/details/46049101