主要區(qū)別
1).MyISAM是非事務(wù)安全型的,而InnoDB是事務(wù)安全型的。
2).MyISAM鎖的粒度是表級界赔,而InnoDB支持行級鎖定。
3).MyISAM支持全文類型索引牵触,而InnoDB不支持全文索引淮悼。
4).MyISAM相對簡單,所以在效率上要優(yōu)于InnoDB揽思,小型應(yīng)用可以考慮使用MyISAM袜腥。
5).MyISAM表是保存成文件的形式,在跨平臺的數(shù)據(jù)轉(zhuǎn)移中使用MyISAM存儲會省去不少的麻煩钉汗。
6).InnoDB表比MyISAM表更安全羹令,可以在保證數(shù)據(jù)不會丟失的情況下鲤屡,切換非事務(wù)表到事務(wù)表(alter table tablename type=innodb)。
應(yīng)用場景
1).MyISAM管理非事務(wù)表福侈。它提供高速存儲和檢索酒来,以及全文搜索能力。如果應(yīng)用中需要執(zhí)行大量的SELECT查詢肪凛,那么MyISAM是更好的選擇堰汉。
2).InnoDB用于事務(wù)處理應(yīng)用程序,具有眾多特性伟墙,包括ACID事務(wù)支持翘鸭。如果應(yīng)用中需要執(zhí)行大量的INSERT或UPDATE操作,則應(yīng)該使用InnoDB戳葵,這樣可以提高多用戶并發(fā)操作的性能就乓。
其他
MyISAM存儲引擎的讀鎖和寫鎖是互斥的,讀寫操作是串行的拱烁。那么档址,一個進(jìn)程請求某個MyISAM表的讀鎖,同時(shí)另一個進(jìn)程也請求同一表的寫鎖邻梆,MySQL如何處理呢守伸?答案是寫進(jìn)程先獲得鎖。不僅如此浦妄,即使讀請求先到鎖等待隊(duì)列尼摹,寫請求后到,寫鎖也會插到讀鎖請求之前剂娄!這是因?yàn)镸ySQL認(rèn)為寫請求一般比讀請求要重要蠢涝。這也正是MyISAM表不太適合于有大量更新操作和查詢操作應(yīng)用的原因,因?yàn)樵呐常罅康母虏僮鲿斐刹樵儾僮骱茈y獲得讀鎖和二,從而可能永遠(yuǎn)阻塞。這種情況有時(shí)可能會變得非常糟糕耳胎!myisam是有讀鎖和寫鎖(2個鎖都是表級別鎖)惯吕。
MySQL表級鎖有兩種模式:表共享讀鎖(Table Read Lock)和表獨(dú)占寫鎖(Table Write Lock)。什么意思呢怕午,就是說對MyISAM表進(jìn)行讀操作時(shí)废登,它不會阻塞其他用戶對同一表的讀請求,但會阻塞 對同一表的寫操作郁惜;而對MyISAM表的寫操作堡距,則會阻塞其他用戶對同一表的讀和寫操作。
InnoDB行鎖是通過給索引項(xiàng)加鎖來實(shí)現(xiàn)的,即只有通過索引條件檢索數(shù)據(jù)羽戒,InnoDB才使用行級鎖缤沦,否則將使用表鎖!行級鎖在每次獲取鎖和釋放鎖的操作需要消耗比表鎖更多的資源易稠。在InnoDB兩個事務(wù)發(fā)生死鎖的時(shí)候疚俱,會計(jì)算出每個事務(wù)影響的行數(shù),然后回滾行數(shù)少的那個事務(wù)缩多。當(dāng)鎖定的場景中不涉及Innodb的時(shí)候呆奕,innodb是檢測不到的。只能依靠鎖定超時(shí)來解決衬吆。
數(shù)據(jù)庫死鎖例子:
兩個sesison梁钾,第一個update表t1,不要提交逊抡。第二個update表t2姆泻,不要提交。接著session1去update表t2冒嫡,session2去update表t1拇勃,此時(shí)就發(fā)生死鎖了。