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

  • 2020 年 7 月 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 表名;

 

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

———————————————————————————————————————————————————————————————————————————-