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

Java面試通關手冊(Java學習指南,歡迎Star,會一直完善下去,歡迎建議和指導):https://github.com/Snailclimb/Java_Guidehtml

一 MyISAM

1.1 MyISAM簡介

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

下面這張圖只是想表達的意思是如今大多數時候咱們使用的都是InnoDB存儲引擎,可是在某些狀況下使用MyISAM更好,好比:MyISAM更適合讀密集的表,而InnoDB更適合寫密集的的表。 在數據庫作主從分離的狀況下,常常選擇MyISAM做爲主庫的存儲引擎。
5.5版本以後,MySQL引入了InnoDBgithub

1.2 MyISAM特色

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

補充概念:面試

Mysql的行鎖和表鎖( 鎖是計算機協調多個進程或純線程併發訪問某一資源的機制)sql

表級鎖: 每次操做鎖住整張表。開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的機率最高,併發度最低;
行級鎖: 每次操做鎖住一行數據。開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的機率最低,併發度也最高;數據庫

二 InnoDB

2.1 MyISAM簡介

InnoDB是MySQL的默認數據庫引擎(5.5版以後),2006年五月時由甲骨文公司併購。與傳統的ISAM與MyISAM相比,InnoDB的最大特點就是支持了ACID兼容的事務(Transaction)功能。緩存

2.2 MyISAM特色

  • 支持行鎖,採用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學習資源)

最後,就是使用阿里雲服務器一段時間後,感受阿里雲真的很不錯,就申請作了阿里雲大使,而後這是個人優惠券地址.

相關文章
相關標籤/搜索