【存儲引擎】
MySQL中的數據用各種不同的技術存儲在文件(或內存)中,這些技術中的每一種技術都使用不同的存儲機制,索引技巧,鎖定水平並且最終提供廣泛的不同功能和能力。在MySQL中將這些不同的技術及配套的相關功能稱爲存儲引擎。
在選擇存儲引擎時,需要考慮一下幾點:
是否有外鍵嗎?
InnoDB支持外鍵,MyISAM不支持
是否需要事務支持嗎?
InnoDB支持事務,MyISAM不支持
是否經常使用什麼樣的查詢模式?
1.COUNT()在 MyISAM 表中會非常快,而在InnoDB 表下可能會很痛苦
2.主鍵查詢在InnoDB下相當快,但如果主鍵太長了也會導致性能問題
3.MyISAM適合select以及insert爲主的應用,InnoDB適合頻繁update以及涉及到安全性較高的應用
數據有多大?
1.大尺寸的數據集趨向於選擇InnoDB方式,因爲其支持事務處理和故障恢復。
2.數據庫的大小決定了故障恢復的時間長短,InnoDB可以利用事務日誌進行數據恢復,速度比較快。
◆是否需要全文索引嗎?
MyISAM支持全文索引
InnoDB也支持FULLTEXT類型的索引
【注意,最後一條特別列舉出來,其實從MySQL5.5開始就已經支持了,但是網上很多地方都說不支持,千萬注意!】
根據經驗來看,如果是一些小型的應用或項目,那麼MyISAM 也許會更適合。
需要記住InnoDB 的表需要更多的內存和存儲,轉換100GB 的MyISAM 表到InnoDB 表可能會讓你有非常壞的體驗。
【區別總結】
1.InnoDB支持外鍵與事務
2.InnoDB 中不保存表的具體行數,執行select count(*) from table時,InnoDB要掃描一遍整個表,但是MyISAM只要簡單的讀出保存好的行數即可。但是,當count(*)語句包含where條件時,兩種表的操作是一樣的。
3.對於AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中,可以和其他字段一起建立聯合索引。
4.delete from table清空整個表時,InnoDB是一行一行的刪除,效率非常慢。MyISAM則會重建表
5.LOAD TABLE FROM MASTER操作對InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,導入數據後再改成InnoDB表,但是對於使用的額外的InnoDB特性(例如外鍵)的表不適用。
6.InnoDB表的行鎖也不是絕對的,如果在執行一個SQL語句時MySQL不能確定要掃描的範圍,InnoDB表同樣會鎖全表,例如update table set num=1 where name like “%aaa%” 。