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
引擎,數據一旦崩潰直接哭吧