MySQL 的存儲引擎

數據庫存儲引擎storage engine,又稱數據表處理器,它是數據庫底層軟件的組織。數據庫管理系統(DBMS)使用數據引擎進行建立、查詢、更新和刪除數據。不一樣的存儲引擎提供不一樣的存儲機制、索引技巧、鎖定水平等功能,使用不一樣的存儲引擎,還能夠 得到特定的功能。mysql

數據表在硬盤上的存儲方式

在文件系統中,MySQL將每一個數據庫 (也稱schema)保存爲數據目錄下的一個子目錄。建立表時,MySQL會在數據庫子目錄下建立一個與表同名的.frm文件保存表的定義。sql

MySQL使用文件系統的目錄來保存數據庫和表的定義,大小寫敏感性與具體的操做系統的文件系統相關。在Windows中,大小寫不敏感;而在Uinux/Linux中則是大小寫敏感。數據庫

不一樣的儲存引擎保存數據和索引的方式是不一樣的,但表的定義在MySQL服務器層是統一處理的。緩存

查看有哪些存儲引擎可用安全

mysql> SHOW ENGINES\G;

查看有哪些存儲引擎可用

查詢默認存儲引擎服務器

mysql> SHOW VARIABLES LIKE 'default_storage_engine%';

查詢默認存儲引擎

查詢數據表的相關信息併發

mysql> SHOW TABLE STATUS LIKE 'user'\G;

查詢數據表的相關信息

下面簡單介紹每一行的含義:app

Name: 表名。函數

Engine:表的存儲引擎類型。高併發

Row_format:行的格式。可選值有 Dynamic、Fixed或者Compressed。

  • Dynamic: 行的長度可變,通常包含可變長度的字段,如VARCHAR或者BLOB。
  • Fixed:行的長度是固定,只包含固定長度的列,如CHAR、INTEGER。
  • Compressed:行存在壓縮表中。

Rows:表中的行數。

Avg_row_length:平均每行包含的字節數。

Data_length:整個表的大小(單位:字節)。

Max_data_length: 表能夠容納的最大數據量

Index_length:索引的大小(單位:字節)。

Data_free: 對於MyISAM表,表示已經分配但目前沒有使用的空間。這部分空間包括以前刪除的行,以及後續可 以被INSERT利用到的空間。

Auto_increment:下一個Auto_increment的值。

Create_time: 表的建立時間。

Update_time:表數據的最後修改時間。

Check_time: 使用 CHECK TABLEmyisamchk工具最後一次檢查表的時間。

Collation: 表的默認字符集和字符排序規則。

Checksum: 若是啓用,則對整個表的內容計算時的校驗和。

Create_options:指表建立時的其餘全部選項。

Comment:包含了其餘額外信息,對於MyISAM引擎,保存的是表建立時帶的註釋;若是表使用的是innoDB引 擎 ,則保存的是表空間的剩餘空間信息;若是是一個視圖,則包含了「VIEW」的文本字樣。

InnoDB存儲引擎

InnoDB是MySQL的默認事務引擎,也是目前最重要、使用最普遍的存儲引擎。它被設計用來處理大量的短時間事務(大部分狀況能正常提交,不多被回滾)。同時,InnoDB的性能和崩潰自動恢復特性使得它在非事務型儲存的需求中也被普遍使用。若非有特別緣由須要使用其餘的儲存引擎,建議優先考慮InnoDB引擎。

概述

InnoDB的數據存儲在表空間(tablespace)中,表空間是由一系列的數據文件構成,相似一個虛擬的文件系統,它存儲和管理全部InnoDB數據表內容。

InnoDB 採用MVCC支持高併發,且實現了四個標準的隔離級別。其默認級別是REPEATABLE READ,且經過間隙鎖策略防止幻讀的出現。間隙鎖使得InnoDB不只鎖定查詢涉及的行,還會對索引中的間隙進行鎖定,防止幻影行的插入。

InnoDB表基於聚蔟索引創建的,其索引結構和MySQL的其餘存儲引擎有很大不一樣,聚蔟索引對主鍵查詢有很高的性能。它的二級索引必須包含主鍵列,因此主鍵很大的話,其餘索引也會很大。所以若表上的索引比較多,主鍵應當儘量小。

四種隔離級別說明

隔離級別 髒讀(Dirty Read) 不可重複讀(NonRepeatable Read) 幻讀(Phantom Read)
未提交讀(Read uncommitted) 可能 可能 可能
已提交讀(Read committed) 不可能 可能 可能
可重複讀(Repeatable read) 不可能 不可能 可能
可串行化(SERIALIZABLE) 不可能 不可能 不可能
  • 髒讀 :一個事務讀取到另外一事務未提交的更新數據。
  • 不可重複讀 : 在同一事務中,屢次讀取同一數據返回的結果有所不一樣, 換句話說, 後續讀取能夠讀到另外一事務已提交的更新數據. 相反, 「可重複讀」在同一事務中屢次讀取數據時, 可以保證所讀數據同樣, 也就是後續讀取不能讀到另外一事務已提交的更新數據。。
  • 幻讀 :一個事務讀到另外一個事務已提交的insert數據。

提供的功能

  • 支持提交和回滾操做,還能夠建立保存點實現部分回滾。
  • 在系統奔潰後可自動恢復。
  • 外鍵和引用完整性支持,包括遞歸式刪除和更新。
  • 數據行級別的鎖定和多版本共存,使得InnoDB數據表在同時檢索和更新操做的複雜查詢中表現出很是好的併發性能。
  • 默認狀況下,InnoDB儲存引擎會把數據表存儲在一個共享的表空間裏,表空間可由多個文件構成,相似一個虛擬的文件系統,它存儲和管理全部InnoDB數據表內容。

MyISAM 存儲引擎

MyISAM是MySQL 5.1 以及以前版本的默認存儲引擎,它提供了全文檢索、壓縮、空間壓縮函數等特性。MyISAM不支持事務和行級鎖,崩潰後沒法安全恢復。若是對於只讀數據,或者表比較小,能夠忍受修復操做,也能夠考慮存儲引擎選用MyISAM。

存儲

MyISAM將表存儲在兩個文件中:數據文件和索引文件,分別以.MYD和.MYI爲擴展名。

MyISAM表能夠包含動態或者靜態(長度固定)行。

MyISAM表的存儲記錄數受限於可用的磁盤空間或者操做系統中單個文件的最大尺寸。

特性

加鎖與併發

MyISAM對整表加鎖,而不是針對行。讀取時會對須要讀到的全部表加共享鎖,寫入時會對錶加排他鎖。若表有讀取查詢時,能夠往表中插入新的記錄,稱之爲併發插入。

修復

MySQL可手工或者自動執行檢查和修復的操做。執行表的修復可能會致使一些數據的丟失,並且過程很是 慢。

可經過CHECK TABLE mytable檢查表的錯誤,若是有錯誤可經過REPAIR TABLE mytable命令修復。若是MySQL服務器已經關閉,可使用myisamchk命令進行檢查和修復的操做。

索引特性

支持全文檢索,這是一種基於分詞建立的索引,能夠支持複雜的查詢。

延遲更新索引鍵

建立MyISAM表時若指定了DELAY_KEY_WRITE選項,在每次修改執行完成時,不會馬上將修改的索引寫入磁盤,而是寫到內存中的鍵緩衝區,在清理緩衝區或者關閉表的時候纔會把對應的索引塊寫入到磁盤。此方式極大提高了寫入性能,可是在數據庫或者主機崩潰時會形成索引損壞,須要執行修復操做。延遲更新索引鍵能夠在全局設置,也能夠爲單表設置。

MyISAM壓縮表

MyISAM壓縮表適合那些建立並導入數據後,再也不進行修改操做的數據表。可使用myisampack對MyISAM表進行壓縮,壓縮後不能修改,除非先將表解壓後修改數據,而後再壓縮。壓縮後,減小了磁盤空間佔用,所以減小了磁盤I/O,從而提高查詢性能。壓縮表支持可讀索引。

MyISAM 性能

MyISAM最典型的性能問題是表鎖的問題,若是發現全部查詢都長期處於「Locked」狀態,那麼就表鎖的問題。


MySQL內建的其餘存儲引擎簡介

Archive 引擎

Archive只支持INSERT和SELECT操做,它會緩存全部的寫並對插入的行進行行壓縮,所以它比MyISAM表的磁盤I/O 更少。Archive引擎每次SELECT查詢須要執行全表掃描,它適合日誌和數據採集類應用,由於這類應用作數據分析時候須要全表掃描。同時也適合須要更快INSERT操做的場合下使用。

Archive支持行級鎖和專用緩衝區,能夠實現高併發插入。在一個查詢開始直到返回表中存在的全部行數以前,它會阻止其餘SELECT執行,以實現讀一致性。Archive在操做批量插入時,在完成前對讀操做是不可見,此機制模仿了事務和MVCC的一些特性,可是它不是一個事務型引擎,而是一個針對高速插入和壓縮作了優化的簡單引擎。

Blackhole引擎

Blackhole引擎沒有實現任何存儲機制,它會丟棄全部插入的數據,不作任何保存。可是服務器會記錄Blackhole表的日誌,因此它適合用於複製數據到備庫,或簡單地記錄到日誌。

CSV引擎

CSV引擎能夠將CSV文件做爲MySQL的表來處理,但它不支持索引。CSV引擎能夠在數據庫運行適合拷入或拷出文件,能夠把Excel等電子表格中的數據存儲爲CSV文件,而後複製到M一SQL數據目錄下,就能在MySQL中打開。

Federated存儲引擎

Federated引擎是訪問其餘MySQL服務器餓一個代理,它建立一個到遠程MySQL服務器的客戶端鏈接,並將查詢傳輸到遠程服務器執行,而後提取或者發送須要的數據。

MERGE儲存引擎

  • 該引擎提供了把多個MyISAM數據表合併爲一個虛擬數據表的手段,查詢一個MEGRE數據表至關於查詢全部成員數據表,這種作法的好處能夠繞開文件系統對各個MyISAM數據表的最大長長大限制。
  • 構成MERGE數據表的全部數據表必須具備一樣的結構。
  • 該引擎適用於日誌或數據倉庫類應用。

Memory儲存引擎

該引擎把數據表保存在內存中,數據表具備固定不變的數據行,所以它的檢索很是快,可是服務器斷電時,表的內容也隨之消失。若是須要快速訪問數據,並且這些數據不會被修改,重啓後丟失也不要緊,能夠考慮使用Memory存儲引擎。

特色:

  • 使用散列索引,所以進行「相等比較」速度很是快,可是進行「範圍比較」速度比較慢。散列索引適合使用「=」和「<=>」,不適合使用「<」和「>」,一樣散列索引也不適合用在ORDER BY字句裏。
  • 該引擎的數據表的數據行裏使用長度固定不變的格式,以此加快處理速度。不能使用BLOB和TEXT這樣長度可變的數據類型。VARCHAR是一種長度可變的類型,可是在MySQL內部被看成一種固定不變的CHAR類型。

適合使用的場景:

  • 用於查找(lookup)或者映射(mapping)表。
  • 用於緩存週期性的聚合數據的結果。
  • 用於保存數據分析中產生的中間數據。

Falcon儲存引擎

  • 支持提交和回滾的操做。
  • 在系統奔潰後可自動恢復。
  • 靈活的鎖定級別和多版本共存,在同時檢索和更新操做的複雜查詢中表現出很是好的併發性能。
  • 在儲存時對數據行進行壓縮,在檢索時對數據行進行解壓縮以節省空間。
  • 平常管理和維護開銷低。

NDB儲存引擎

該引擎是MySQL的集羣儲存引擎。

命令總結

查看有哪些存儲引擎可用

mysql> SHOW ENGINES\G;

查詢默認存儲引擎

mysql> SHOW VARIABLES LIKE 'default_storage_engine%';

查詢數據表的相關信息

mysql> SHOW TABLE STATUS LIKE 'user'\G;
相關文章
相關標籤/搜索