MySQL 存儲引擎

 

存儲引擎

DBMS使用存儲引擎進行數據的建立、查詢、更新、刪除操做。數據庫

不一樣的存儲引擎提供不一樣的存儲機制、索引技巧、鎖定水平等功能,使用不一樣的存儲引擎還能夠得到特定的功能。緩存

MySQL提供了多種存儲引擎,最多見的有3種。安全

 

 


 

 

 

一、MyISAM 

MySQL5.5以前的默認的存儲引擎,每一個MyISAM在磁盤上存儲成三個文件,文件名和表名相同,擴展名分別是服務器

(1)frm文件:存儲表的定義併發

(2)MYD文件:存儲表中的數據(記錄)工具

(3)MYI文件:存儲索引。索引保存的是數據文件的指針性能

 

特色

  • 訪問速度快(優)
  • 支持全文索引(優)。但基本不使用MySQL的全文索引,全文索引通常都是使用第三方的ElasticSearch,Solr等更加成熟的解決方案。
  • 不支持事務、外鍵(缺)
  • 默認的鎖粒度爲表級鎖,因此併發度不好(缺),但加鎖快,鎖衝突較少,不容易發生死鎖(優);
  • 對數據的查詢緩存只緩存索引,不緩存數據(記錄),並且使用的是操做系統自己的緩存。
  • 自動增加列能夠是組合主鍵中的任何一列。設置自動增加列:建立表時,在字段後加auto_increment,默認初始值是1

 

 

適用場景

  • 不須要事務
  • 不使用外鍵
  • 操做以select、insert爲主

 

 

MyISAM支持三種不一樣的存儲格式

(1)靜態表(fixed)spa

表中不能包含變長字段(好比VARCHAR, BLOB, TEXT),每一個記錄都是固定的長度。若是MyISAM表中沒有一個變長字段,則默認使用靜態表。操作系統

優勢:存儲迅速,出現故障容易恢復指針

缺點:佔用空間比動態表大。靜態表在進行數據存儲時會按照事先定義的列寬補足空格,但在訪問的時候會去掉補的空格

 

(2)動態表(dynamic)

可包含變長字段(varchar、blob、text),若是一個MyISAM表包含任何可變長度的字段,或者該表建立時用row_format=dynamic指定,則該表使用動態格式存儲

優勢:佔用空間小

缺點:頻繁的更新、刪除操做會產生碎片,須要按期用optimize table語句或myisamchk -r命令來改善性能,出現故障後較難恢復

 

(3)壓縮表

由myisampack工具建立,每條記錄都會被單獨壓縮,佔據硬盤空間極小。

 

 


 

 

 

二、InnoDB 

MySQL5.5及其以後默認的存儲引擎

 

InnoDB有2種存儲方式

  • 共享表空間存儲:全部表的定義、數據、索引存放在同一個表空間中。
  • 獨佔表空間存儲:一張表獨佔一個表空間,表的定義保存在.frm文件中,數據、索引保存在.ibd文件中。

 

 

特色

  • 自動增加列必須是主鍵,若是是組合主鍵,也必須是組合主鍵的第一列
  • 支持外鍵約束。MySQL的存儲引擎中只有innoDB支持外鍵。外鍵下降了查詢速度(由於要查多張表)、使多張表耦合在一塊兒,但更好地體現了實體、表之間的關聯。
  • 支持事務,恢復能力強。默認的事務隔離級別爲可重複讀
  • 使用的鎖粒度爲行級鎖,支持更高的併發。行級鎖、事務,安全性有了,可是以犧牲效率換來的。
  • 會將查詢的結果(索引+數據)放到緩衝池中,加快後續查詢的速度
  • 發生故障後恢復性好。未完成的事務將根據redo log的數據重作;已提交但未寫入的修改,將從doublewrite buffer重作;系統閒時會purge buffer
  • 主鍵索引是彙集索引(Clustered index,僅InnoDB支持),根據主鍵查詢時效率高,但根據主鍵進行刪改時效率低。彙集索引:物理存儲順序與索引順序相同
  • 支持在線熱備

 

 

適用場景

  • 對安全性有要求(事務+恢復性好),好比財務、計費、銀行
  • 併發高(行級鎖)
  • 使用外鍵

 

能夠在join查詢中混用InnoDB引擎的表、其餘引擎的表

 

 


 

 

 

MyISAM、InnoDB的對比

(1)鎖粒度不一樣,InnoDB爲行級鎖,MyISAM爲表級鎖

  • InnoDB對併發的支持遠比MyISAM高
  • 但InnoDB鎖衝突的機率更大,更容易發生死鎖,並且爲每一行加鎖,開銷也很大

 

(2)InnoDB支持外鍵,MyISAM不支持

 

(3)InnoDB支持事務,MyISAM不支持

  • InnoDB更安全,開銷也更大

 

(4)InnoDB緩存查詢到的索引、數據,MyISAM只緩存索引

 

(5)查詢效率MyISAM遠高於InnoDB,尤爲是在數據錶行數多的時候

  • MyISAM的索引中存儲的是數據(記錄)的指針(地址),先查索引肯定要操做的記錄的地址,直接就去訪問這個地址
  • InnoDB的索引存儲的是記錄的行號,從索引中查到行號(行座標),還須要逐行統計行號(從第一行開始數)
  • 並且InnoDB在查詢過程當中,要維護緩衝池中的查詢緩存(索引+數據),MyISAM只需維護緩存中的索引

 

(6)InnoDB支持在線熱備,有很成熟的在線熱備解決方案


(7)MyISAM的表文件包括:.frm(表定義),.MYI(索引),.MYD(數據),InnoDB的表文件爲.frm(表定義),.ibd(索引、數據)

 

一句話,MyISAM效率更高、速度更快,InnoDB功能更全、安全性更好、開銷更大。

 

 


 

 

 

三、MEMORY

數據(記錄)不是儲存在文件中,而是存儲在內存中。每一個memory表對應一個.frm文件(表定義、索引)。

 

特色

  • 訪問速度極快。數據存放在內存中+使用HASH索引
  • 宕機、關閉服務器,數據會丟失
  • 表的大小有限制(內初有限)
  • 對錶的數據類型有限制。好比:只支持定長類型,VARCHAR會被自動存儲爲CHAR類型,不支持TEXT、BLOB
  • 鎖粒度爲表級鎖。併發量大的時候,表級鎖會成爲MEMORY存儲引擎的瓶頸

 

 

適用場景

  • 存儲臨時、不重要的數據
  • 大量讀 ,做爲緩存

 

 


 

 

如何選擇合適的存儲引擎

  • 安全性要求(事務)
  • 併發高不高
  • 使不使用外鍵
  • 是否須要支持在線熱備

 

一個數據庫中,不一樣的表可使用不一樣的存儲引擎。

使用合適的存儲引擎,會提升數據庫的性能。

相關文章
相關標籤/搜索