1. 程式人生 > 資料庫 >簡單瞭解MySQL儲存引擎

簡單瞭解MySQL儲存引擎

1. MySql體系結構

在介紹儲存引擎之前先來介紹下MySql的體系結構,以便大家知道儲存引擎在MySql整個體系中處於什麼位置。下圖是官方提供的一張架構圖:

簡單瞭解MySQL儲存引擎

MySQL體系結構圖

從上圖可以發現,MySQL由以下幾部分組成:

  • 連線池元件
  • 管理服務和工具元件
  • SQL介面元件
  • 查詢分析器元件
  • 優化器元件
  • 緩衝(Cache)元件
  • 外掛式儲存引擎
  • 物理檔案

MySQL資料庫區別於其他資料庫的最重要的一個特點就是其外掛式的表儲存引擎,從上圖中也可以看到,MySql支援很多種儲存引擎。需要特別注意的是,儲存引擎是基於表的,而不是資料庫。

2. MySql儲存引擎

外掛式儲存引擎的好處是:能夠根據具體的應用的特點選擇不同的儲存引擎。下面是幾種MySQL常用的儲存引擎。

2.1 InnoDB儲存引擎

InnoDB儲存引擎支援事務,其設計目標主要面向線上事務處理(OLTP)的應用。其特點是行鎖設計、支援外來鍵,並支援類似於Oracle的非鎖定讀,即預設讀取操作不會產生鎖。從MySQL資料庫5.5.8版本開始,InnoDB儲存引擎是預設的儲存引擎。

InnoDB通過使用多版本併發控制(MVCC)來獲得高併發性,並且實現了SQL標準的4種隔離級別,預設為REPEATABLE級別。同時,使用一種被稱為next-key locking的策略來避免幻讀(phantom)現象的產生。除此之外,InnoDB儲存引擎還提供了插入緩衝(insert buffer)、二次寫(double write)、自適應雜湊索引(adaptive hash index)、預讀(read ahead)等高效能和高可用的功能。

對於表中資料的儲存,InnoDB儲存引擎採用了聚集(clustered)的方式,因此每張表的儲存都是按主鍵的順序進行存放。如果沒有顯式地在表定義時指定主鍵,InnoDB儲存引擎會為每一行生成一個6位元組的ROWID,並以此作為主鍵。

2.2 MyISAM儲存引擎

MyISAM儲存引擎不支援事務、表鎖設計,支援全文索引,主要面向一些OLAP資料庫應用。此外,MyISAM儲存引擎的另一個與眾不同的地方是它的緩衝池只快取(cache)索引檔案,而不緩衝資料檔案,這點和大多數的資料庫都非常不同。從MySQL 5.0版本開始,MyISAM預設支援256TB的單表資料,這足夠滿足一般應用需求。

2.3 Memory儲存引擎

Memory儲存引擎(之前稱HEAP儲存引擎)將表中的資料存放在記憶體中,如果資料庫重啟或發生崩潰,表中的資料都將消失。它非常適合用於儲存臨時資料的臨時表,以及資料倉庫中的緯度表。Memory儲存引擎預設使用雜湊索引,而不是我們熟悉的B+樹索引。

雖然Memory儲存引擎速度非常快,但在使用上還是有一定的限制。比如,只支援表鎖,併發效能較差,並且不支援TEXT和BLOB列型別。最重要的是,儲存變長欄位(varchar)時是按照定常欄位(char)的方式進行的,因此會浪費記憶體。

此外有一點容易被忽視,MySQL資料庫使用Memory儲存引擎作為臨時表來存放查詢的中間結果集(intermediate result)。如果中間結果集大於Memory儲存引擎表的容量設定,又或者中間結果含有TEXT或BLOB列型別欄位,則MySQL資料庫會把其轉換到MyISAM儲存引擎表而存放到磁碟中。之前提到MyISAM不快取資料檔案,因此這時產生的臨時表的效能對於查詢會有損失。

2.4 Archive儲存引擎

Archive儲存引擎只支援INSERT和SELECT操作,從MySQL 5.1開始支援索引。Archive儲存引擎使用zlib演算法將資料行(row)進行壓縮後儲存,壓縮比一般可達1∶10。正如其名字所示,Archive儲存引擎非常適合儲存歸檔資料,如日誌資訊。Archive儲存引擎使用行鎖來實現高併發的插入操作,但是其本身並不是事務安全的儲存引擎,其設計目標主要是提供高速的插入和壓縮功能。

當然MySql還支援很多其他的儲存引擎,這邊不一一列舉了。

3. 儲存引擎對比整理

儲存引擎可以理解為表的儲存結構,每種儲存引擎都支援不同的特性。MySQL支援外掛式的儲存引擎,可以為每張資料表指定不同的儲存引擎。常用的儲存引擎的特點整體如下:

簡單瞭解MySQL儲存引擎

我們也可以使用下面命令檢視當前資料庫支援哪些儲存引擎:

-- 檢視支援的儲存引擎
show engines;

下面對最常用的三種儲存引擎做下簡單總結介紹:

  • InnoDB:MySQL預設的儲存引擎,支援事務、支援行級鎖和表級鎖、支援各類索引、支援外來鍵,高版本的MySQL還支援全文索引,但是批量資料插入的效率較低;
  • MyISAM:具有較高的資料插入效率和資料查詢速度,支援全文索引,但是不支援資料庫事務,不支援行級鎖,只支援表級鎖;
  • MEMORY:使用這個儲存引擎時,會將表中的資料載入到記憶體中,查詢很快,但是對記憶體要求較高。

所以我們應該根據應用的具體需求選擇合適的儲存引擎,而不是不加思考的都選擇預設儲存引擎(INNODB)。

如果要提供提交、回滾和恢復的事務安全(ACID相容)能力,並要求實現併發控制,InnoDB是一個很好的選擇。如果資料表主要用來插入和查詢記錄,則MyISAM引擎提供較高的處理效率。如果只是臨時存放資料,資料量不大,並且不需要較高的資料安全性,可以選擇將資料儲存在記憶體的MEMORY引擎中,MySQL中使用該引擎作為臨時表,存放查詢的中間結果。如果只有INSERT和SELECT操作,可以選擇Archive引擎,Archive儲存引擎支援高併發的插入操作,但是本身並不是事務安全的。Archive儲存引擎非常適合儲存歸檔資料,如記錄日誌資訊可以使用Archive引擎。

4. 參考

《MySQL技術內幕》

以上就是簡單瞭解MySQL儲存引擎的詳細內容,更多關於MySQL儲存引擎的資料請關注我們其它相關文章!