一 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 二者的常見對比
-
count運算上的區別: 因為MyISAM緩存有表meta-data(行數等),因此在做COUNT(*)時對于一個結構很好的查詢是不需要消耗多少資源的。而對于InnoDB來說,則沒有這種緩存。
-
是否支持事務和崩潰后的安全恢復: MyISAM 強調的是性能,每次查詢具有原子性,其執行數度比InnoDB類型更快,但是不提供事務支持。但是InnoDB 提供事務支持事務,外部鍵等高級數據庫功能。 具有事務(commit)、回滾(rollback)和崩潰修復能力(crash recovery capabilities)的事務安全(transaction-safe (ACID compliant))型表。
3)是否支持外鍵: MyISAM不支持,而InnoDB支持。
《MySQL高性能》上面有一句話這樣寫到:
不要輕易相信“MyISAM比InnoDB快”之類的經驗之談,這個結論往往不是絕對的。在很多我們已知場景中,InnoDB的速度都可以讓MyISAM望塵莫及,尤其是用到了聚簇索引,或者需要訪問的數據都可以放入內存的應用。
一般情況下我們選擇 InnoDB 都是沒有問題的,但是某些情況下你并不在乎可擴展能力和并發能力,也不需要事務支持,也不在乎崩潰后的安全恢復問題的話,選擇MyISAM也是一個不錯的選擇。但是一般情況下,我們都是需要考慮到這些問題的。