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