Mysql引擎InnoDB和MyISAM的區別
Mysql的引擎機制有兩種,分別是MyISAM
和InnoDB
,mysql5.5版本之後預設的引擎已經是InnoDB
了。本文簡單講解一下這2中引擎機制的區別
鎖機制
MyISAM:只支援表級鎖,使用者在操作myisam表時,select,update,delete,insert語句都會給表自動加鎖,這種處理方式一方面加鎖的開銷比較小,且不會出現死鎖,但另一方面併發效能較差
InnoDB:支援行鎖。每次操作鎖住一行資料,一方面行級鎖在每次獲取鎖和釋放鎖的操作需要消耗比表鎖更多的資源,速度較慢,且可能發生死鎖,但是另一方面由於鎖的粒度較小,發生鎖衝突的概率也比較低,併發性較好。此外,即使是使用了InnoDB儲存引擎,但如果MySQL執行一條sql語句時不能確定要掃描的範圍,也會鎖住整張表。
事務機制
MyISAM:不支援事務
InnoDB:支援事務。由於MyISAM在很長一段時間內是MySQL的預設儲存引擎,所以在很多人的印象中MySQL是不支援事務的資料庫。實際上,InnoDB是一個性能良好的事務性引擎。它實現了四個標準的隔離級別,預設的隔離級別為可重複讀(REPEATABLE READ),並通過間隙鎖策略來防止幻讀的出現。此外它還通過多版本併發控制(MVCC)來支援高併發。
記錄數查詢
MyISAM:直接記錄了表的行數,使用select count(*)
時直接給出結果
InnnoDB:需要全表掃描來統計行數,當資料量很大時比較耗時,但是當使用where
來指定範圍時,兩者的耗時是一樣的
外來鍵機制
MyISAM:不支援外來鍵
InnoDb:支援外來鍵
修復機制
MyISAM:崩潰後無法安全恢復
InnoDB:支援崩潰後的安全恢復。InnoDB實現了一套完善的崩潰恢復機制,保證在任何狀態下(包括在崩潰恢復狀態下)資料庫掛了,都能正常恢復
如果你問我那我怎麼選擇引擎呢,直接InnoDB
,官方把預設引擎從MyISAM
改成InnoDB
不是沒有原因的,而且使用MyISAM
引擎,資料一旦崩潰直接哭吧