MySQL三種InnoDB、MyISAM和MEMORY儲存引擎對比

庸人自擾∞發表於2020-07-30
什麼是儲存引擎?
MySQL中的資料用各種不同的技術儲存在檔案(或者記憶體)中。這些技術中的每一種技術都使用不同的儲存機制、索引技巧、鎖定水平並且最終提供廣泛的不同的功能和能力。通過選擇不同的技術,你能夠獲得額外的速度或者功能,從而改善你的應用的整體功能。這就是儲存引擎

儲存引擎是資料庫的核心,對於mysql來說,儲存引擎是以外掛的形式執行的。雖然mysql支援多鍾儲存引擎,但是常用的也就那麼幾種。這次主要是對InnoDB、MyISAM和MEMORY儲存引擎進行一個總結和對比。

 

使用命令檢視當前資料庫支援的儲存引擎

show engines;

 

可以看到這裡支援了9種不同的儲存引擎,不同的儲存引擎都有各自的特點,以適應不同的需求。

BDB: 源自Berkeley DB,事務型資料庫的另一種選擇,支援COMMIT和ROLLBACK等其他事務特性
Memory :所有資料置於記憶體的儲存引擎,擁有極高的插入,更新和查詢效率。但是會佔用和資料量成正比的記憶體空間。並且其內容會在Mysql重新啟動時丟失
Merge :將一定數量的MyISAM表聯合而成一個整體,在超大規模資料儲存時很有用
CSV: 邏輯上由逗號分割資料的儲存引擎。它會在資料庫子目錄裡為每個資料表建立一個.CSV檔案。這是一種普通文字檔案,每個資料行佔用一個文字行。CSV儲存引擎不支援索引。
Federated: 將不同的Mysql伺服器聯合起來,邏輯上組成一個完整的資料庫。非常適合分散式應用
MyISAM: 擁有較高的插入,查詢速度,但不支援事務
InnoDB :5.5版本後Mysql的預設資料庫,事務型資料庫的首選引擎,支援ACID事務,支援行級鎖定
BlackHole :黑洞引擎,寫入的任何資料都會消失,一般用於記錄binlog做複製的中繼
Archive :非常適合儲存大量的獨立的,作為歷史記錄的資料。因為它們不經常被讀取。Archive擁有高效的插入速度,但其對查詢的支援相對較差
————————————————————————————————————————————————————————————————————————
這裡我們主要是來比較InnoDB、MyISAM和MEMORY

三種引擎的區別:

  • 事務:InnoDB支援事務,MyISAM和MEMORY兩個不支援。
  • 儲存限制:InnoDB有64TB的儲存限制,MyISAM和MEMORY要跟具體情況而定。
  • 空間使用:InnoDB對空間使用程度較高,MyISAM和MEMORY對空間使用程度較低。
  • 記憶體使用:InnoDB和MEMORY對記憶體使用程度較高,MyISAM對記憶體使用程度較低。
  • 插入資料的速度:InnoDB插入資料的速度較低,MyISAM和MEMORY插入資料的速度較高。
  • 對外來鍵的支援:InnoDB對外來鍵支援情況較好,MyISAM和MEMORY兩個不支援外來鍵。

1.InnoDB

InnoDB是事務型資料庫的首選引擎,支援事務安全表(ACID),其它儲存引擎都是非事務安全表,支援行鎖定和外來鍵,MySQL5.5以後預設使用InnoDB儲存引擎。

它的主要特點有:

(1)可以通過自動增長列,方法是auto_increment。

(2)支援事務。預設的事務隔離級別為可重複度,通過MVCC(併發版本控制)來實現的。

(3)使用的鎖粒度為行級鎖,可以支援更高的併發;

(4)支援外來鍵約束;外來鍵約束其實降低了表的查詢速度,但是增加了表之間的耦合度。

(5)配合一些熱備工具可以支援線上熱備份;

(6)在InnoDB中存在著緩衝管理,通過緩衝池,將索引和資料全部快取起來,加快查詢的速度;

(7)對於InnoDB型別的表,其資料的物理組織形式是聚簇表。所有的資料按照主鍵來組織。資料和索引放在一塊,都位於B+數的葉子節點上;

當然InnoDB的儲存表和索引也有下面兩種形式:

(1)使用共享表空間儲存:所有的表和索引存放在同一個表空間中。

(2)使用多表空間儲存:表結構放在frm檔案,資料和索引放在IBD檔案中。分割槽表的話,每個分割槽對應單獨的IBD檔案,分割槽表的定義可以檢視我的其他文章。使用分割槽表的好處在於提升查詢效率。

對於InnoDB來說,最大的特點在於支援事務。但是這是以損失效率來換取的。

2.MyISAM

MyISAM基於ISAM儲存引擎,並對其進行擴充套件。它是在Web、資料倉儲和其他應用環境下最常使用的儲存引擎之一。MyISAM擁有較高的插入、查詢速度,但不支援事務,不支援外來鍵。

使用這個儲存引擎,每個MyISAM在磁碟上儲存成三個檔案。

(1)frm檔案:儲存表的定義資料

(2)MYD檔案:存放表具體記錄的資料

(3)MYI檔案:儲存索引

frm和MYI可以存放在不同的目錄下。MYI檔案用來儲存索引,但僅儲存記錄所在頁的指標,索引的結構是B+樹結構。下面這張圖就是MYI檔案儲存的機制:

 

 

從這張圖可以發現,這個儲存引擎通過MYI的B+樹結構來查詢記錄頁,再根據記錄頁查詢記錄。並且支援全文索引、B樹索引和資料壓縮。

支援資料的型別也有三種:

(1)靜態固定長度表

這種方式的優點在於儲存速度非常快,容易發生快取,而且表發生損壞後也容易修復。缺點是佔空間。這也是預設的儲存格式。

(2)動態可變長表

優點是節省空間,但是一旦出錯恢復起來比較麻煩。

(3)壓縮表

上面說到支援資料壓縮,說明肯定也支援這個格式。在資料檔案發生錯誤時候,可以使用check table工具來檢查,而且還可以使用repair table工具來恢復。

特點

插入資料快,空間和記憶體使用比較低。如果表主要是用於插入新記錄和讀出記錄,那麼選擇MyISAM能實現處理高效率。如果應用的完整性、併發性要求比較低,也可以使用。

3.MEMORY

MEMORY儲存引擎將表中的資料儲存到記憶體中,為查詢和引用其他表資料提供快速訪問。每一個表實際上都和一個磁碟檔案關聯。檔案是frm。

特點:

(1)支援的資料型別有限制,比如:不支援TEXT和BLOB型別,對於字串型別的資料,只支援固定長度的行,VARCHAR會被自動儲存為CHAR型別;

(2)支援的鎖粒度為表級鎖。所以,在訪問量比較大時,表級鎖會成為MEMORY儲存引擎的瓶頸;

(3)由於資料是存放在記憶體中,一旦伺服器出現故障,資料都會丟失;

(4)查詢的時候,如果有用到臨時表,而且臨時表中有BLOB,TEXT型別的欄位,那麼這個臨時表就會轉化為MyISAM型別的表,效能會急劇降低;

(5)預設使用hash索引。

(6)如果一個內部表很大,會轉化為磁碟表。

 

不同的儲存引擎有不同的特點,我們可以根據需求來選擇儲存引擎。 還有一個就是資料表也是有儲存引擎的,一個資料庫裡面的資料表可以是不同的儲存引擎

建立表時指定儲存引擎的型別:

CREATE TABLE 表名(欄位 約束 型別) ENGINE = INNODB

改變現有的表使用的儲存引擎,用以下語句:

ALTER TABLE mytable ENGINE = MyISAM

可以直接使用檢視資料表建立的語句就能看到當前資料表使用的儲存引擎:

show create table 表名;

 

 參考部落格:https://baijiahao.baidu.com/s?id=1655327558614401593&wfr=spider&for=pc

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

相關文章