當(dāng)前,絕大多數(shù)業(yè)務(wù)場(chǎng)景用InnoDB已經(jīng)完全能搞定了,越來(lái)越多的業(yè)務(wù)從MyISAM轉(zhuǎn)向InnoDB引擎,那么有哪些注意事項(xiàng)呢?
當(dāng)了解完兩種引擎的不同之處,很輕松的就能知道有哪些關(guān)鍵點(diǎn)了。
總的來(lái)說(shuō),從MyISAM轉(zhuǎn)向InnoDB的注意事項(xiàng)有:
1、MyISAM的主鍵索引中,可以在非第一列(非第一個(gè)字段)使用自增列,而InnoDB的主鍵索引中包含自增列時(shí),必須在最前面;這個(gè)特性在discuz論壇中,被設(shè)計(jì)用于“搶樓”功能,因此,若有類(lèi)似的業(yè)務(wù),則無(wú)法將該表從MyISAM轉(zhuǎn)成InnoDB,需要自行變通實(shí)現(xiàn)(我們則是將其改到Redis中實(shí)現(xiàn));
2、不帶條件頻繁統(tǒng)計(jì)全表總記錄數(shù)時(shí)(SELECT COUNT(*) FROM TAB),InnoDB相對(duì)較慢,而MyISAM則飛快;不過(guò),如果是基于索引條件的統(tǒng)計(jì),則二者相差不大;
3、InnoDB在5.6以前不支持全文索引,不過(guò)這個(gè)相信無(wú)所謂,沒(méi)什么人會(huì)在MySQL里直接跑全文索引,尤其是對(duì)中文的全文索引(前陣子有開(kāi)發(fā)同學(xué)提需求直接被我否了),確實(shí)有需要的話(huà),可以采用Sphinx、Lucene等其他方案實(shí)現(xiàn);
4、一次性導(dǎo)入大量數(shù)據(jù)并且后續(xù)還要進(jìn)行加工處理的,可以先導(dǎo)入到MyISAM引擎表中,經(jīng)過(guò)一通加工處理完后,再導(dǎo)入InnoDB表(我曾經(jīng)在業(yè)務(wù)中用此方法提高數(shù)據(jù)批量導(dǎo)入及處理效率);
5、InnoDB不支持LOAD TABLE FROM MASTER語(yǔ)法(不過(guò)應(yīng)該也很少人使用吧);
從MyISAM轉(zhuǎn)成InnoDB可以享受的好處則有:
1、完整事務(wù)特性支持,以及更高的數(shù)據(jù)并發(fā)存取效率,即更高的TPS;
2、數(shù)據(jù)庫(kù)實(shí)例異常重啟后,InnoDB表能自動(dòng)修復(fù),而且速度相對(duì)更快,而MyISAM需要被觸發(fā)才能修復(fù),且相對(duì)耗時(shí)可能多4~5倍甚至更多;
3、更高的數(shù)據(jù)讀取性能,因?yàn)镮nnoDB把數(shù)據(jù)及索引同時(shí)緩存在內(nèi)存中,而MyISAM只緩存了索引;
4、InnoDB支持外鍵(不過(guò)在MySQL中,應(yīng)該很少人用到外鍵);
兩個(gè)引擎間的重要區(qū)別詳情見(jiàn)下:
MyISAM引擎的特點(diǎn):
1、堆組織表;
2、不支持事務(wù);
3、數(shù)據(jù)文件和索引文件分開(kāi)存儲(chǔ);
4、支持全文索引;
5、主鍵索引和二級(jí)索引完全一樣都是B+樹(shù)的數(shù)據(jù)結(jié)構(gòu),只有是否唯一的區(qū)別(主鍵和唯一索引有唯一屬性,其他普通索引沒(méi)有唯一屬性。B+樹(shù)葉子節(jié)點(diǎn)存儲(chǔ)的都是指向行記錄的row pointer);
6、有特殊計(jì)數(shù)器記錄當(dāng)前記錄數(shù);
7、不支持Crash recovery;
8、索引文件很容易損壞;
InnoDB引擎的特點(diǎn)
1、索引組織表;
2、支持事務(wù);
3、數(shù)據(jù)文件和索引文件存儲(chǔ)在同一個(gè)表空間中;
4、在5.6以前,不支持全文索引;
5、主鍵和二級(jí)索引數(shù)據(jù)結(jié)構(gòu)一樣都是B+樹(shù),但葉子節(jié)點(diǎn)存儲(chǔ)的鍵值不一樣(主鍵的葉子節(jié)點(diǎn)存儲(chǔ)整行數(shù)據(jù),因此也稱(chēng)為聚集索引;而二級(jí)索引的葉子節(jié)點(diǎn)存儲(chǔ)的是主鍵的鍵值)
5、支持Crash recovery;
6、相同數(shù)據(jù)量時(shí),InnoDB表空間文件大小約為MyISAM引擎的1.5~2倍;
關(guān)于InnoDB、MyISAM兩種引擎的對(duì)比測(cè)試,可以參考Percona的這個(gè)對(duì)比:http://www.percona.com/blog/2007/01/08/innodb-vs-myisam-vs-falcon-benchmarks-part-1/
更多建議: