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

一 MyISAM

1.1 MyISAM簡介sql

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

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

clipboard.png

1.2 MyISAM特色安全

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

補充概念:併發

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

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

二 InnoDB

2.1 MyISAM簡介高併發

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

2.2 MyISAM特色spa

  • 支持行鎖,採用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是最好的選擇。

本文做者:snailclimb
閱讀原文本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索