[MySQLFAQ]系列—從MyISAM轉到InnoDB需要注意什麼

晚來風急發表於2017-08-02
問題當前,絕大多數業務場景用InnoDB已經完全能搞定了,越來越多的業務從MyISAM轉向InnoDB引擎,那麼有哪些注意事項呢?分析當了解完兩種引擎的不同之處,很輕鬆的就能知道有哪些關鍵點了。

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

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

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

1、完整事務特性支援,以及更高的資料併發存取效率,即更高的TPS;
2、資料庫例項異常重啟後,InnoDB表能自動修復,而且速度相對更快,而MyISAM需要被觸發才能修復,且相對耗時可能多4~5倍甚至更多;
3、更高的資料讀取效能,因為InnoDB把資料及索引同時快取在記憶體中,而MyISAM只快取了索引;
4、InnoDB支援外來鍵(不過在MySQL中,應該很少人用到外來鍵);

兩個引擎間的重要區別詳情見下:

MyISAM引擎的特點:

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

InnoDB引擎的特點


6、相同資料量時,InnoDB表空間檔案大小約為MyISAM引擎的1.5~2倍;

文章轉自老葉茶館公眾號,原文連結:
http://imysql.com/2014/11/01/mysql-faq-convert-myisam-to-innodb-tips.shtml


相關文章