MySQL: MyISAM or InnoDB?
通過(guò)JavaLobby看到的一篇博文,為選擇MySQL的數(shù)據(jù)表引擎提供了一些意見(jiàn),希望對(duì)大家有幫助。(2009.05.31最后更新)我這個(gè)可愛(ài)的小哥哥祝可愛(ài)的小朋友們節(jié)日愉快 ^_^
MyISAM是MySQL的默認(rèn)存儲(chǔ)引擎,但很多人忘記還有其它的選擇。決定使用哪種(哪些)存儲(chǔ)引擎可能需要些技巧,但評(píng)估一下MyISAM是否適合你的需要還是值得的。有一組存儲(chǔ)引擎可用,但我將只關(guān)注MyISAM和InnoDB,因?yàn)樗鼈儽挥玫淖疃唷?br /> 需考慮的問(wèn)題:
你是否需要外鍵?
你是否需要事務(wù)?
你是否需要全文索引?
你的數(shù)據(jù)訪問(wèn)(查詢)模式是什么?
你的數(shù)據(jù)集有多大?
思考上述問(wèn)題將使你走入正確的方向,但有些例外。如果你使用事務(wù)或外鍵,就使用InnoDB。要使用全文索引,你常需選擇MyISAM,因?yàn)樗鼉?nèi)建地支持這一特性;但是,MyISAM難以應(yīng)對(duì)超過(guò)200萬(wàn)的數(shù)據(jù)行。你可以使用Sphinx以使你的InnoDB表能獲取全文索引,但這需要花費(fèi)一些時(shí)間。
數(shù)據(jù)集的大小是決定你使用哪種引擎的主要因素。由于InnoDB的事務(wù)和崩潰恢復(fù)特性,對(duì)于較大的數(shù)據(jù)集,則傾向于該引擎。然而,恢復(fù)MyISAM數(shù)據(jù)表所花費(fèi)的時(shí)間由數(shù)據(jù)集的大小來(lái)衡量,但恢復(fù)InnoDB所花費(fèi)的時(shí)間由事務(wù)日志的大小來(lái)衡量-而你對(duì)日志有一定的控制力。例如,相較于恢復(fù) InnoDB數(shù)據(jù)表所需要的幾分鐘,你可能需要幾小時(shí)甚至幾天時(shí)間來(lái)恢復(fù)MyISAM數(shù)據(jù)表。
你讀/寫數(shù)據(jù)表的方式可能會(huì)極大地影響你所使用的存儲(chǔ)引擎的性能。在MyISAM數(shù)據(jù)表中執(zhí)行COUNT()會(huì)很快,但對(duì)于InnoDB數(shù)據(jù)表則十分痛苦,最好避免。在InnoDB數(shù)據(jù)表中查找主鍵極其的快,但要注意到,太長(zhǎng)的主鍵會(huì)影響到性能。批量插入在MyISAM數(shù)據(jù)表更快些,但批量更新在 InnoDB中會(huì)較快些--特別是當(dāng)進(jìn)行并發(fā)增加時(shí)。
那么你應(yīng)該選擇哪種引擎呢?如果你工作在一個(gè)小項(xiàng)目中,那么MyISAM可能正適合你。甚至在較大環(huán)境中使用MyISAM也能獲取很大的成功,但這依具體情況不同而不同。如果你計(jì)劃用于非常大的數(shù)據(jù)集,并且需要事務(wù)或外鍵約束,那就應(yīng)該直接使用InnoDB。但需要記住,相較于MyISAM,InnoDB 數(shù)據(jù)表需要很大的內(nèi)存和存儲(chǔ)空間。將100GB的MyISAM數(shù)據(jù)表轉(zhuǎn)化成InnoDB數(shù)據(jù)表就會(huì)表現(xiàn)得令人吃驚的壞。