MySQL存儲引擎介紹


MySql數據庫最大的特點就是其插件式的存儲引擎架構,本文主要介紹MySql經常使用的存儲引擎,爲開發時選擇合適的存儲引擎提供參考。算法


1. MySql體系結構

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

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支持插件式的存儲引擎,能夠爲每張數據表指定不一樣的存儲引擎。經常使用的存儲引擎的特色總體以下:

咱們也可使用下面命令查看當前數據庫支持哪些存儲引擎:

-- 查看支持的存儲引擎
show engines;

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

  • InnoDB:MySQL默認的存儲引擎,支持事務、支持行級鎖和表級鎖、支持各種索引、支持外鍵,高版本的MySQL還支持全文索引,可是批量數據插入的效率較低;
  • MyISAM:具備較高的數據插入效率和數據查詢速度,支持全文索引,可是不支持數據庫事務,不支持行級鎖,只支持表級鎖;
  • MEMORY:使用這個存儲引擎時,會將表中的數據加載到內存中,查詢很快,可是對內存要求較高。

因此咱們應該根據應用的具體需求選擇合適的存儲引擎,而不是不加思考的都選擇默認存儲引擎(INNODB)。

若是要提供提交、回滾和恢復的事務安全(ACID兼容)能力,並要求實現併發控制,InnoDB是一個很好的選擇。若是數據表主要用來插入和查詢記錄,則MyISAM引擎提供較高的處理效率。若是隻是臨時存放數據,數據量不大,而且不須要較高的數據安全性,能夠選擇將數據保存在內存的MEMORY引擎中,MySQL中使用該引擎做爲臨時表,存放查詢的中間結果。若是隻有INSERT和SELECT操做,能夠選擇Archive引擎,Archive存儲引擎支持高併發的插入操做,可是自己並非事務安全的。Archive存儲引擎很是適合存儲歸檔數據,如記錄日誌信息可使用Archive引擎。

4. 參考

  • 《MySQL技術內幕》
相關文章
相關標籤/搜索