MySQL常見的兩種儲存引擎:MyISAM與InnoDB的愛恨情仇

Guide哥發表於2018-06-05

我自己總結的Java學習的系統知識點以及面試問題,已經開源,目前已經 41k+ Star。會一直完善下去,歡迎建議和指導,同時也歡迎Star: github.com/Snailclimb/…

一 MyISAM

1.1 MyISAM簡介

MyISAM是MySQL的預設資料庫引擎(5.5版之前),由早期的 ISAM (Indexed Sequential Access Method:有索引的順序訪問方法)所改良。雖然效能極佳,而且提供了大量的特性,包括全文索引、壓縮、空間函式等,但MyISAM不支援事務和行級鎖,而且最大的缺陷就是崩潰後無法安全恢復。不過,5.5版本之後,MySQL引入了InnoDB(另一種資料庫引擎)。

下面這張圖只是想表達的意思是現在大多數時候我們使用的都是InnoDB儲存引擎,但是在某些情況下使用 MyISAM 也是合適的比如讀密集的情況下。(如果你不介意 MyISAM 崩潰回覆問題的話)。

5.5版本之後,MySQL引入了InnoDB

1.2 MyISAM特點

  • 不支援行鎖(MyISAM只有表鎖),讀取時對需要讀到的所有表加鎖,寫入時則對錶加排他鎖;
  • 不支援事務
  • 不支援外來鍵
  • 不支援崩潰後的安全恢復
  • 在表有讀取查詢的同時,支援往表中插入新紀錄
  • 支援BLOB和TEXT的前500個字元索引,支援全文索引
  • 支援延遲更新索引,極大地提升了寫入效能
  • 對於不會進行修改的表,支援 壓縮表 ,極大地減少了磁碟空間的佔用

補充概念:

Mysql的行鎖和表鎖( 鎖是計算機協調多個程式或純執行緒併發訪問某一資源的機制) 表級鎖: 每次操作鎖住整張表。開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的概率最高,併發度最低; 行級鎖: 每次操作鎖住一行資料。開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高;

二 InnoDB

2.1 InnoDB簡介

InnoDB是MySQL的預設資料庫引擎(5.5版之後),2006年五月時由甲骨文公司併購。與傳統的ISAM與MyISAM相比,InnoDB的最大特色就是支援了ACID相容的事務(Transaction)功能。

2.2 InnoDB特點

  • 支援行鎖,採用MVCC來支援高併發,有可能死鎖
  • 支援事務
  • 支援外來鍵
  • 支援崩潰後的安全恢復
  • 不支援全文索引

三 關於二者的對比與總結

3.1 二者的常見對比

1) count運算上的區別: 因為MyISAM快取有表meta-data(行數等),因此在做COUNT(*)時對於一個結構很好的查詢是不需要消耗多少資源的。而對於InnoDB來說,則沒有這種快取。

2) 是否支援事務和崩潰後的安全恢復: MyISAM 強調的是效能,每次查詢具有原子性,其執行數度比InnoDB型別更快,但是不提供事務支援。但是InnoDB 提供事務支援事務,外部鍵等高階資料庫功能。 具有事務(commit)、回滾(rollback)和崩潰修復能力(crash recovery capabilities)的事務安全(transaction-safe (ACID compliant))型表。

3)是否支援外來鍵: MyISAM不支援,而InnoDB支援。

《MySQL高效能》上面有一句話這樣寫到:

不要輕易相信“MyISAM比InnoDB快”之類的經驗之談,這個結論往往不是絕對的。在很多我們已知場景中,InnoDB的速度都可以讓MyISAM望塵莫及,尤其是用到了聚簇索引,或者需要訪問的資料都可以放入記憶體的應用。

一般情況下我們選擇 InnoDB 都是沒有問題的,但是某事情況下你並不在乎可擴充套件能力和併發能力,也不需要事務支援,也不在乎崩潰後的安全恢復問題的話,選擇MyISAM也是一個不錯的選擇。但是一般情況下,我們都是需要考慮到這些問題的。

公眾號

如果大家想要實時關注我更新的文章以及分享的乾貨的話,可以關注我的公眾號。

《Java面試突擊》: 由本文件衍生的專為面試而生的《Java面試突擊》V2.0 PDF 版本公眾號後臺回覆 "Java面試突擊" 即可免費領取!

Java工程師必備學習資源: 一些Java工程師常用學習資源公眾號後臺回覆關鍵字 “1” 即可免費無套路獲取。

我的公眾號

相關文章