1. 程式人生 > 資料庫 >MySQL 儲存引擎

MySQL 儲存引擎

 

儲存引擎

DBMS使用儲存引擎進行資料的建立、查詢、更新、刪除操作。

不同的儲存引擎提供不同的儲存機制、索引技巧、鎖定水平等功能,使用不同的儲存引擎還可以獲得特定的功能。

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

 

 


 

 

 

1、MyISAM 

MySQL5.5之前的預設的儲存引擎,每個MyISAM在磁碟上儲存成三個檔案,檔名和表名相同,副檔名分別是

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

(2)MYD檔案:儲存表中的資料(記錄)

(3)MYI檔案:儲存索引。索引儲存的是資料檔案的指標

 

特點

  • 訪問速度快(優)
  • 支援全文索引(優)。但基本不使用MySQL的全文索引,全文索引一般都是使用第三方的ElasticSearch,Solr等更加成熟的解決方案。
  • 不支援事務、外來鍵(缺)
  • 預設的鎖粒度為表級鎖,所以併發度很差(缺),但加鎖快,鎖衝突較少,不容易發生死鎖(優);
  • 對資料的查詢快取只快取索引,不快取資料(記錄),而且使用的是作業系統本身的快取。
  • 自動增長列可以是組合主鍵中的任何一列。設定自動增長列:建立表時,在欄位後加auto_increment,預設初始值是1

 

 

適用場景

  • 不需要事務
  • 不使用外來鍵
  • 操作以select、insert為主

 

 

MyISAM支援三種不同的儲存格式

(1)靜態表(fixed)

表中不能包含變長欄位(比如VARCHAR, BLOB, TEXT),每個記錄都是固定的長度。如果MyISAM表中沒有一個變長欄位,則預設使用靜態表。

優點:儲存迅速,出現故障容易恢復

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

 

(2)動態表(dynamic)

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

優點:佔用空間小

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

 

(3)壓縮表

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


 

 


 

 

 

2、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功能更全、安全性更好、開銷更大。

 

 


 

 

 

3、MEMORY

資料(記錄)不是儲存在檔案中,而是儲存在記憶體中。每個memory表對應一個.frm檔案(表定義、索引)。

 

特點

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

 

 

適用場景

  • 儲存臨時、不重要的資料
  • 大量讀 ,作為快取

 

 


 

 

如何選擇合適的儲存引擎

  • 安全性要求(事務)
  • 併發高不高
  • 使不使用外來鍵
  • 是否需要支援線上熱備

 

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

使用合適的儲存引擎,會提高資料庫的效能。