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

Guide哥發表於2018-06-05

Java面試通關手冊(Java學習指南,歡迎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更適合讀密集的表,而InnoDB更適合寫密集的的表。 在資料庫做主從分離的情況下,經常選擇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支援。

3.2 總結

MyISAM更適合讀密集的表,而InnoDB更適合寫密集的的表。 在資料庫做主從分離的情況下,經常選擇MyISAM作為主庫的儲存引擎。

一般來說,如果需要事務支援,並且有較高的併發讀取頻率(MyISAM的表鎖的粒度太大,所以當該表寫併發量較高時,要等待的查詢就會很多了),InnoDB是不錯的選擇。如果你的資料量很大(MyISAM支援壓縮特性可以減少磁碟的空間佔用),而且不需要支援事務時,MyISAM是最好的選擇。

歡迎關注我的微信公眾號:"Java面試通關手冊"(一個有溫度的微信公眾號,無廣告,單純技術分享,期待與你共同進步~~~堅持原創,分享美文,分享各種Java學習資源)

最後,就是使用阿里雲伺服器一段時間後,感覺阿里雲真的很不錯,就申請做了阿里雲大使,然後這是我的優惠券地址.

相關文章