一.Innodb引擎
Innodb引擎提供了對數(shù)據(jù)庫ACID事務的支持睡雇,并且實現(xiàn)了SQL標準的四種隔離級別。該引擎還提供了行級鎖和外鍵約束混移,它的設計目標是處理大容量數(shù)據(jù)庫系統(tǒng)亲茅,它本身其實就是基于MySQL后臺的完整數(shù)據(jù)庫系統(tǒng),MySQL運行時Innodb會在內(nèi)存中建立緩沖池验残,用于緩沖數(shù)據(jù)和索引氨鹏。但是該引擎不支持FULLTEXT類型的索引何缓,而且它沒有保存表的行數(shù)还栓,當SELECT COUNT(*) FROM TABLE時需要掃描全表碌廓。當需要使用數(shù)據(jù)庫事務時,該引擎當然是首選剩盒。由于鎖的粒度更小谷婆,寫操作不會鎖定全表,所以在并發(fā)較高時辽聊,使用Innodb引擎會提升效率纪挎。但是使用行級鎖也不是絕對的,如果在執(zhí)行一個SQL語句時MySQL不能確定要掃描的范圍跟匆,InnoDB表同樣會鎖全表异袄。
二.MyIASM引擎
MyIASM是MySQL默認的引擎,但是它沒有提供對數(shù)據(jù)庫事務的支持玛臂,也不支持行級鎖和外鍵烤蜕,因此當INSERT(插入)或UPDATE(更新)數(shù)據(jù)時即寫操作需要鎖定整個表封孙,效率便會低一些。不過和Innodb不同讽营,MyIASM中存儲了表的行數(shù)虎忌,于是SELECT COUNT(*) FROM TABLE時只需要直接讀取已經(jīng)保存好的值而不需要進行全表掃描。如果表的讀操作遠遠多于寫操作且不需要數(shù)據(jù)庫事務的支持橱鹏,那么MyIASM也是很好的選擇膜蠢。
三.MyISAM與InnoDB的區(qū)別
1、MyIASM是非事務安全的莉兰,而InnoDB是事務安全的
2挑围、MyIASM鎖的粒度是表級的,而InnoDB支持行級鎖
3贮勃、MyIASM支持全文類型索引贪惹,而InnoDB不支持全文索引
4、MyIASM相對簡單寂嘉,效率上要優(yōu)于InnoDB奏瞬,小型應用可以考慮使用MyIASM
5、MyIASM表保存成文件形式泉孩,跨平臺使用更加方便
6硼端、MyISAM類型的表強調(diào)的是性能,其執(zhí)行數(shù)度比InnoDB類型更快
以下是一些細節(jié)和具體實現(xiàn)的差別:
1.InnoDB不支持FULLTEXT類型的索引寓搬。
2.InnoDB 中不保存表的具體行數(shù)珍昨,也就是說,執(zhí)行select count(*) fromtable時句喷,InnoDB要掃描一遍整個表來計算有多少行镣典,但是MyISAM只要簡單的讀出保存好的行數(shù)即可。注意的是唾琼,當count(*)語句包含where條件時兄春,兩種表的操作是一樣的。
3.對于AUTO_INCREMENT類型的字段锡溯,InnoDB中必須包含只有該字段的索引赶舆,但是在MyISAM表中,可以和其他字段一起建立聯(lián)合索引祭饭。
4.DELETE FROM table時芜茵,InnoDB不會重新建立表,而是一行一行的刪除倡蝙。
5.LOAD TABLE FROMMASTER操作對InnoDB是不起作用的九串,解決方法是首先把InnoDB表改成MyISAM表,導入數(shù)據(jù)后再改成InnoDB表寺鸥,但是對于使用的額外的InnoDB特性(例如外鍵)的表不適用蒸辆。
另外征炼,InnoDB表的行鎖也不是絕對的,假如在執(zhí)行一個SQL語句時MySQL不能確定要掃描的范圍躬贡,InnoDB表同樣會鎖全表谆奥,例如updatetable set num=1 where name like “a%”
兩種類型最主要的差別就是Innodb支持事務處理與外鍵和行級鎖.而MyISAM不支持.所以MyISAM往往就容易被人認為只適合在小項目中使用。
從對數(shù)據(jù)庫平臺要達到需求:99.9%的穩(wěn)定性拂玻,方便的擴展性和高可用性來說的話酸些,MyISAM絕對是首選。
原因如下:
1檐蚜、如果是讀多寫少的項目魄懂,建議使用MyISAM,MyISAM的讀性能是比Innodb強不少的闯第。
2市栗、MyISAM的索引和數(shù)據(jù)是分開的,并且索引是有壓縮的咳短,內(nèi)存使用率就對應提高了不少填帽。能加載更多索引,而Innodb是索引和數(shù)據(jù)是緊密捆綁的咙好,沒有使用壓縮從而會造成Innodb比MyISAM體積龐大不小篡腌。
3、select count(*) 和order by是最頻繁的勾效,大概能占了整個sql總語句的60%以上的操作嘹悼,而這種操作Innodb其實也是會鎖表的,很多人以為Innodb是行級鎖层宫,那個只是where對它主鍵是有效杨伙,非主鍵的都會鎖全表的。
4萌腿、如果和MyISAM比insert寫操作的話缀台,Innodb還達不到MyISAM的寫性能,如果是針對基于索引的update操作哮奇,雖然MyISAM可能會遜色Innodb,但是那么高并發(fā)的寫,從庫能否追的上也是一個問題睛约,還不如通過多實例分庫分表架構來解決鼎俘。
四.MyISAM和InnoDB應用場景:
1、MyIASM管理非事務表辩涝,提供高速存儲和檢索以及全文搜索能力贸伐,如果再應用中執(zhí)行大量select操作,應該選擇MyIASM
2怔揩、InnoDB用于事務處理捉邢,具有ACID事務支持等特性脯丝,如果在應用中執(zhí)行大量insert和update操作,應該選擇InnoDB
一般來說伏伐,MyISAM適合:
(1)做很多count 的計算宠进;
(2)插入不頻繁,查詢非常頻繁藐翎;
(3)沒有事務材蹬。
InnoDB適合:
(1)可靠性要求比較高,或者要求事務吝镣;
(2)表更新和查詢都相當?shù)念l繁堤器,并且表鎖定的機會比較大的情況指定數(shù)據(jù)引擎的創(chuàng)建
可以肯定的是,MyISAM的確快末贾,但是如果你的邏輯設計需要事務處理闸溃,你就可以自由使用支持事務處理的引擎。進一步講拱撵,由于MySQL能夠允許你在表格這一層應用數(shù)據(jù)庫引擎辉川,所以你可以只對需要事務處理的表格來進行性能優(yōu)化,而把不需要事務處理的表格交給更加輕便的MyISAM引擎裕膀。對于 MySQL而言员串,靈活性才是關鍵。
MySQL 官方對InnoDB是這樣解釋的:InnoDB給MySQL提供了具有提交昼扛、回滾和崩潰恢復能力的事務安全(ACID兼容)存儲引擎寸齐。InnoDB鎖定在行級并且也在SELECT語句提供一個Oracle風格一致的非鎖定讀,這些特色增加了多用戶部署和性能抄谐。沒有在InnoDB中擴大鎖定的需要渺鹦,因為在InnoDB中行級鎖定適合非常小的空間。InnoDB也支持FOREIGN KEY強制蛹含。在SQL查詢中毅厚,你可以自由地將InnoDB類型的表與其它MySQL的表的類型混合起來,甚至在同一個查詢中也可以混合浦箱。
InnoDB是為處理巨大數(shù)據(jù)量時的最大性能設計吸耿,它的CPU效率可能是任何其它基于磁盤的關系數(shù)據(jù)庫引擎所不能匹敵的。
InnoDB存儲引擎被完全與MySQL服務器整合酷窥,InnoDB存儲引擎為在主內(nèi)存中緩存數(shù)據(jù)和索引而維持它自己的緩沖池咽安。InnoDB存儲它的表&索引在一個表空間中,表空間可以包含數(shù)個文件(或原始磁盤分區(qū))蓬推。這與MyISAM表不同妆棒,比如在MyISAM表中每個表被存在分離的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制為2GB的操作系統(tǒng)上糕珊。
InnoDB默認地被包含在MySQL二進制分發(fā)中动分。Windows Essentials installer使InnoDB成為Windows上MySQL的默認表。
InnoDB被用來在眾多需要高性能的大型數(shù)據(jù)庫站點上產(chǎn)生红选。著名的Internet新聞站點Slashdot.org運行在InnoDB上澜公。 Mytrix, Inc.在InnoDB上存儲超過1TB的數(shù)據(jù),還有一些其它站點在InnoDB上處理平均每秒800次插入/更新的.