myisam與innodb的異同
一、引言
儲存引擎是mysql三層架構中的最下面的一層,負責資料的儲存和提取,也是mysql的核心所在。儲存引擎提供統一的api供上層呼叫。雖然對上層提供的api是統一的,但是不同的儲存引擎有不同的實現方式。每個儲存引擎都有各自的側重點,從而各有優缺點。
在mysql 5.5版本前,預設的儲存引擎為myisam。在那之後mysql的預設儲存引擎改為innodb。這兩個儲存引擎都是非常經典的儲存引擎,因此在面試中也被經常拿來做對比。這兩個儲存引擎既有很多的不同點,但是也有一些相同點。下面詳細介紹一下。
二、 myisam與innodb的不同點
myisam不支援事務,innodb支援事務。由於myisam在很長一段時間內是mysql的預設儲存引擎,所以在很多人的印象中mysql是不支援事務的資料庫。實際上,innodb是乙個效能良好的事務性引擎。它實現了四個標準的隔離級別,預設的隔離級別為可重複讀(repeatable read),並通過間隙鎖策略來防止幻讀的出現。此外它還通過多版本併發控制(mvcc)來支援高併發。
對錶的行數查詢的支援不同。myisam內建了乙個計數器來儲存表的行數。執行 select count() 時直接從計數器中讀取,速度非常快。而innodb不儲存這些資訊,執行 select count()需要全表掃瞄。當表中資料量非常大的時候速度很慢。
鎖的粒度不同。myisam僅支援表鎖。每次操作鎖住整張表。這種處理方式一方面加鎖的開銷比較小,且不會出現死鎖,但另一方面併發效能較差。innodb支援行鎖。每次操作鎖住一行資料,一方面行級鎖在每次獲取鎖和釋放鎖的操作需要消耗比表鎖更多的資源,速度較慢,且可能發生死鎖,但是另一方面由於鎖的粒度較小,發生鎖衝突的概率也比較低,併發性較好。此外,即使是使用了innodb儲存引擎,但如果mysql執行一條sql語句時不能確定要掃瞄的範圍,也會鎖住整張表。
對主鍵的要求不同。myisam允許沒有主鍵的表存在。而如果在建表時沒有顯示的指定主鍵,innodb就會為每一行資料自動生成乙個6位元組的rowid列,並以此做為主鍵。這種主鍵對使用者不可見。innodb對主鍵採取這樣的策略是與它的資料和索引的組織方式有關的,下文會講到。
資料和索引的組織方式不同。myisam將索引和資料分開進行儲存。索引存放在.myi檔案中,資料存放在.myd檔案中。索引中儲存了相應資料的位址。以表名+.myi檔案分別儲存。 innodb的主鍵索引樹的葉子節點儲存主鍵和相應的資料。其它的索引樹的葉子節點儲存的是主鍵。也正是因為採取了這種儲存方式,innodb才強制要求每張表都要有主鍵。
對auto_increment的處理方式不一樣。如果將某個字段設定為increment,innodb中規定必須包含只有該字段的索引。但是在myisam中,也可以將該字段和其他字段一起建立聯合索引。
delete from table的處理方式不一樣。myisam會重新建立表。innodb不會重新建立表,而是一行一行的刪除。因此速度非常慢。推薦使用truncate table,不過需要使用者有drop此表的許可權。
myisam崩潰後無法安全恢復,innodb支援崩潰後的安全恢復。innodb實現了一套完善的崩潰恢復機制,保證在任何狀態下(包括在崩潰恢復狀態下)資料庫掛了,都能正常恢復。
myisam不支援外來鍵,innodb支援外來鍵。
快取機制不同。myisam僅快取索引資訊,而不快取實際的資料資訊。而innodb不僅快取索引資訊,還會快取資料資訊。其將資料檔案按頁讀取到緩衝池,然後按最近最少使用的演算法來更新資料。
三、 myisam和innodb的相同點
兩者都僅支援b+樹索引,不支援hash索引。innodb中有一種自適應雜湊索引的機制。其會根據表的使用情況自動的為表生成雜湊索引。但這是不能認為干預的。所以也可以認為innodb不支援雜湊索引。
都支援全文索引。mysql5.6版本後 innodb 已經支援全文索引了。並且在5.7版本之後支援中文的全文索引。
四、 總結
myisam和innodb都是mysql非常經典的儲存引擎。本文詳細對比了兩者的異同點。總體來說,myisam只適合一些資料量小的,對併發和事務等沒有要求的場景。而大部分場景都最好預設使用innodb儲存引擎。
五、 參考
《高效能mysql》(第三版)
《mysql技術內幕:innodb儲存引擎》
MyISAM與InnoDB 的區別
innodb支援事務,myisam不支援,對於innodb每一條sql語言都預設封裝成事務,自動提交,這樣會影響速度,所以最好把多條sql語言放在begin和commit之間,組成乙個事務 innodb支援外來鍵,而myisam不支援。對乙個包含外來鍵的innodb表轉為myisam會失敗 inno...
InnoDB與MyISAM的區別
1 儲存結構上不同 myisam非聚簇索引,資料在磁碟上分成3個資料檔案存放,frm字尾檔案是表結構檔案,myd字尾是表資料檔案,myi是表索引檔案。innodb聚簇索引,資料 表結構 資料 索引 都存放在乙個資料檔案 也可能多個,但是是不同的表空間 2 儲存空間不同 myisam可被壓縮,儲存空間...
MyISAM與InnoDB 的區別
1.事務 innodb支援,myisam不支援,在innodb中每一條sql語句都會預設封裝成事務自動提交,然而這樣會影響速度,因此最好把多條sql語句放在begin和commit之間組成乙個事務 2.索引 innodb是聚集索引,使用b tree作為索引結構,資料檔案是和 主鍵 索引綁在一起的 表...