從MyISAM轉到InnoDB需要注意什么

2018-02-24 16:05 更新

問題

當前,絕大多數(shù)業(yè)務場景用InnoDB已經(jīng)完全能搞定了,越來越多的業(yè)務從MyISAM轉向InnoDB引擎,那么有哪些注意事項呢?

分析

當了解完兩種引擎的不同之處,很輕松的就能知道有哪些關鍵點了。

總的來說,從MyISAM轉向InnoDB的注意事項有:

1、MyISAM的主鍵索引中,可以在非第一列(非第一個字段)使用自增列,而InnoDB的主鍵索引中包含自增列時,必須在最前面;這個特性在discuz論壇中,被設計用于“搶樓”功能,因此,若有類似的業(yè)務,則無法將該表從MyISAM轉成InnoDB,需要自行變通實現(xiàn)(我們則是將其改到Redis中實現(xiàn));
2、不帶條件頻繁統(tǒng)計全表總記錄數(shù)時(SELECT COUNT(*) FROM TAB),InnoDB相對較慢,而MyISAM則飛快;不過,如果是基于索引條件的統(tǒng)計,則二者相差不大;
3、InnoDB在5.6以前不支持全文索引,不過這個相信無所謂,沒什么人會在MySQL里直接跑全文索引,尤其是對中文的全文索引(前陣子有開發(fā)同學提需求直接被我否了),確實有需要的話,可以采用Sphinx、Lucene等其他方案實現(xiàn);
4、一次性導入大量數(shù)據(jù)并且后續(xù)還要進行加工處理的,可以先導入到MyISAM引擎表中,經(jīng)過一通加工處理完后,再導入InnoDB表(我曾經(jīng)在業(yè)務中用此方法提高數(shù)據(jù)批量導入及處理效率);
5、InnoDB不支持LOAD TABLE FROM MASTER語法(不過應該也很少人使用吧);

從MyISAM轉成InnoDB可以享受的好處則有:

1、完整事務特性支持,以及更高的數(shù)據(jù)并發(fā)存取效率,即更高的TPS;
2、數(shù)據(jù)庫實例異常重啟后,InnoDB表能自動修復,而且速度相對更快,而MyISAM需要被觸發(fā)才能修復,且相對耗時可能多4~5倍甚至更多;
3、更高的數(shù)據(jù)讀取性能,因為InnoDB把數(shù)據(jù)及索引同時緩存在內(nèi)存中,而MyISAM只緩存了索引;
4、InnoDB支持外鍵(不過在MySQL中,應該很少人用到外鍵);

兩個引擎間的重要區(qū)別詳情見下:

MyISAM引擎的特點:

1、堆組織表;
2、不支持事務;
3、數(shù)據(jù)文件和索引文件分開存儲;
4、支持全文索引;
5、主鍵索引和二級索引完全一樣都是B+樹的數(shù)據(jù)結構,只有是否唯一的區(qū)別(主鍵和唯一索引有唯一屬性,其他普通索引沒有唯一屬性。B+樹葉子節(jié)點存儲的都是指向行記錄的row pointer);
6、有特殊計數(shù)器記錄當前記錄數(shù);
7、不支持Crash recovery;
8、索引文件很容易損壞;

InnoDB引擎的特點

1、索引組織表;
2、支持事務;
3、數(shù)據(jù)文件和索引文件存儲在同一個表空間中;
4、在5.6以前,不支持全文索引;
5、主鍵和二級索引數(shù)據(jù)結構一樣都是B+樹,但葉子節(jié)點存儲的鍵值不一樣(主鍵的葉子節(jié)點存儲整行數(shù)據(jù),因此也稱為聚集索引;而二級索引的葉子節(jié)點存儲的是主鍵的鍵值)
5、支持Crash recovery;
6、相同數(shù)據(jù)量時,InnoDB表空間文件大小約為MyISAM引擎的1.5~2倍;

關于InnoDB、MyISAM兩種引擎的對比測試,可以參考Percona的這個對比:http://www.percona.com/blog/2007/01/08/innodb-vs-myisam-vs-falcon-benchmarks-part-1/

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號