MySQL存儲引擎MyISAM 和 InnoDB 的區(qū)別

關(guān)于MySQL存儲引擎的介紹參考上期文章:MySQL存儲引擎
本期我們來聊一聊MySQL存儲引擎MyISAMInnoDB 的區(qū)別

相愛相殺的背景

MySQL 5.5 之前,MyISAM 引擎一直是 MySQL 默認(rèn)存儲引擎,憑借其全文索引、壓縮、空間函數(shù)等特性,在一眾存儲引擎中可謂是一時無兩。
隨著InnoDB推出,盡管MyISAM 的性能還行,各種特性也還不錯(比如全文索引、壓縮、空間函數(shù)等)。但是,MyISAM 不支持事務(wù)和行級鎖,而且最大的缺陷就是崩潰后無法安全恢復(fù)。
5.5 版本之后,MySQL 引入了 InnoDB(事務(wù)性數(shù)據(jù)庫引擎),MySQL 5.5 版本后默認(rèn)的存儲引擎為 InnoDB。
言歸正傳!咱們下面還是來簡單對比一下兩者:

對比

1.是否支持行級鎖

MyISAM 只有表級鎖(table-level locking),而 InnoDB 支持行級鎖(row-level locking)和表級鎖,默認(rèn)為行級鎖
也就說,MyISAM 一鎖就是鎖住了整張表,這在并發(fā)寫的情況下是多么滴憨憨??!這也是為什么 InnoDB 在并發(fā)寫的時候,性能更牛皮了!

??這里埋個坑,關(guān)于行級鎖(row-level locking)表級鎖(table-level locking)我們有機會再聊。

2.是否支持事務(wù)

MyISAM 不提供事務(wù)支持。

InnoDB 提供事務(wù)支持,具有提交(commit)和回滾(rollback)事務(wù)的能力。

3.是否支持外鍵

MyISAM 不支持,而 InnoDB 支持。

?? 一家之言:

在日常開發(fā)中不建議在數(shù)據(jù)庫層面使用外鍵的,應(yīng)用層面可以解決。
不過,這樣會對數(shù)據(jù)的一致性造成威脅。具體要不要使用外鍵還是要根據(jù)你的項目和業(yè)務(wù)來決定。

4.是否支持?jǐn)?shù)據(jù)庫異常崩潰后的安全恢復(fù)

MyISAM 不支持,而 InnoDB 支持。

使用 InnoDB 的數(shù)據(jù)庫在異常崩潰后,數(shù)據(jù)庫重新啟動的時候會保證數(shù)據(jù)庫恢復(fù)到崩潰前的狀態(tài)。這個恢復(fù)的過程依賴于redo log

?? 拓展一下:

  • MySQL InnoDB 引擎使用 redo log(重做日志) 保證事務(wù)的持久性,使用 undo log(回滾日志) 來保證事務(wù)的原子性。
  • MySQL InnoDB 引擎通過 鎖機制、MVCC 等手段來保證事務(wù)的隔離性( 默認(rèn)支持的隔離級別是 REPEATABLE-READ )。
  • 保證了事務(wù)的持久性、原子性、隔離性之后,一致性才能得到保障。

5.是否支持 MVCC

MyISAM 不支持,而 InnoDB 支持。

?? 一家之言:

MVCC 可以看作是行級鎖的一個升級,可以有效減少加鎖操作,提供性能。MyISAM 不支持行級鎖,更別說MVCC。

關(guān)于 MyISAM 和 InnoDB 的選擇問題

MySQL 5.5 版本后默認(rèn)的存儲引擎為 InnoDB。而且大多數(shù)時候我們使用的都是 InnoDB 存儲引擎,在某些讀密集的情況下,使用 MyISAM 也是合適的。不過,前提是你的項目不介意 MyISAM 不支持事務(wù)、崩潰恢復(fù)等缺點。
《MySQL 高性能》上面有一句話這樣寫到:

不要輕易相信“MyISAM 比 InnoDB 快”之類的經(jīng)驗之談,這個結(jié)論往往不是絕對的。在很多我們已知場景中,InnoDB 的速度都可以讓 MyISAM 望塵莫及,尤其是用到了聚簇索引,或者需要訪問的數(shù)據(jù)都可以放入內(nèi)存的應(yīng)用。

一般情況下我們選擇 InnoDB 都是沒有問題的,但是某些情況下你并不在乎可擴展能力和并發(fā)能力,也不需要事務(wù)支持,也不在乎崩潰后的安全恢復(fù)問題的話,選擇 MyISAM 也是一個不錯的選擇。但是一般情況下,我們都是需要考慮到這些問題的。
因此,對于咱們?nèi)粘i_發(fā)的業(yè)務(wù)系統(tǒng)來說,你幾乎找不到什么理由再使用 MyISAM 作為自己的 MySQL 數(shù)據(jù)庫的存儲引擎。

?? 面試常問

  • InnoDB支持事務(wù),MyISAM不支持事務(wù)
  • InnoDB支持外鍵,MyISAM不支持外鍵
  • InnoDB 支持 MVCC(多版本并發(fā)控制),MyISAM 不支持
  • select count(*) from table時,MyISAM更快,因為它有一個變量保存了整個表的總行數(shù),可以直接讀取,InnoDB就需要全表掃描。
  • Innodb不支持全文索引,而MyISAM支持全文索引(5.7以后的InnoDB也支持全文索引)
  • InnoDB支持表、行級鎖,而MyISAM支持表級鎖。
  • InnoDB表必須有主鍵,而MyISAM可以沒有主鍵
  • Innodb表需要更多的內(nèi)存和存儲,而MyISAM可被壓縮,存儲空間較小。
  • Innodb按主鍵大小有序插入,MyISAM記錄插入順序是,按記錄插入順序保存。
  • InnoDB 存儲引擎提供了具有提交、回滾、崩潰恢復(fù)能力的事務(wù)安全,與 MyISAM 比 InnoDB 寫的效率差一些,并且會占用更多的磁盤空間以保留數(shù)據(jù)和索引
  • InnoDB 屬于索引組織表,使用共享表空間和多表空間儲存數(shù)據(jù)。MyISAM用.frm、.MYD、.MTI來儲存表定義,數(shù)據(jù)和索引。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容