我自己總結的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 崩潰回覆問題的話)。
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” 即可免費無套路獲取。