我們?cè)趺催x擇合適的引擎?這里簡(jiǎn)單歸納一句話:“除非需要用到某些innodb不具備的特性,并且沒(méi)有其他辦法可以替代,否則都應(yīng)該優(yōu)先選擇innodb引擎。”
? ?除非萬(wàn)不得已,否則不建議混合使用多種存儲(chǔ)引擎,否則可能帶來(lái)一系列復(fù)雜的問(wèn)題以及一些潛在的BUG。
使用不同引擎考慮的幾大因素:
? ?1.事務(wù)
? ? ? ? ? ?如果需要事務(wù)支持,那么InnoDB或者XtraDB目前最穩(wěn)定。如果不需要事務(wù)且主要是SELECT和INSERT操作,MyISAM是不錯(cuò)的選擇。
? ?2.備份
? ?? ? ? ?如果需要在線熱備份,InnoDB是基本的選擇。
? ?3.崩潰恢復(fù)
? ? ? ? ? 數(shù)據(jù)量比較大的時(shí)候,系統(tǒng)崩潰后如何快速恢復(fù)是一個(gè)需要考慮的問(wèn)題,這也是許多人即使不需要事務(wù)支持也選擇InnoDB的原因。
? 轉(zhuǎn)換表的引擎:
? ?1.ALTER TABLE
? ? ? ?最簡(jiǎn)單的方法就是ALTER TABLE語(yǔ)句: ?
?mysql>?ALTER?TABLE?mytable?ENGINE?=?InnoDB;
? ? ? ?這個(gè)語(yǔ)法適用于任何存儲(chǔ)引擎,但是需要執(zhí)行很長(zhǎng)的時(shí)間。
??轉(zhuǎn)換表的存儲(chǔ)引擎,將會(huì)失去和原引擎相關(guān)的所有特性。
? ?2.導(dǎo)出與導(dǎo)入
? ? ? ?可以使用mysqldump工具將數(shù)據(jù)導(dǎo)出到文件,然后修改文件中CREATE TABLE語(yǔ)句的存儲(chǔ)引擎,請(qǐng)注意修改表名。
? ? ? ?同時(shí)請(qǐng)注意mysqldump工具默認(rèn)會(huì)自動(dòng)在CREATE TABLE語(yǔ)句前加上DROP TABLE語(yǔ)句,小心數(shù)據(jù)丟失。
? ?3.創(chuàng)建與查詢
? ? ? ?綜合第一種與第二種,先創(chuàng)建一個(gè)新的存儲(chǔ)引擎表,然后利用INSTER … SELECT語(yǔ)法來(lái)導(dǎo)數(shù)據(jù)
?????????mysql>?CREATE?TABLE?innodb_table?LIKE?myisam_table; ???????mysql>ALTER?TABLE?innodb_table?ENGINE=InnoDB; ???????mysql>INSTER?INTO?innodb_table?SELECT?*?FROM?myisam_table;
? ? ? ?數(shù)據(jù)量大的話可以分批處理,針對(duì)每一段數(shù)據(jù)執(zhí)行事務(wù)提交操作,避免大事務(wù)產(chǎn)生的undo。Percona Toolkit提供了一個(gè)pt-online-schema-change的工具,可以簡(jiǎn)單,方便的執(zhí)行避免手工操作導(dǎo)致的失誤。