數據庫存儲引擎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。
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 TABLE
或myisamchk工具最後一次檢查表的時間。
Collation: 表的默認字符集和字符排序規則。
Checksum: 若是啓用,則對整個表的內容計算時的校驗和。
Create_options:指表建立時的其餘全部選項。
Comment:包含了其餘額外信息,對於MyISAM引擎,保存的是表建立時帶的註釋;若是表使用的是innoDB引 擎 ,則保存的是表空間的剩餘空間信息;若是是一個視圖,則包含了「VIEW」的文本字樣。
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) | 不可能 | 不可能 | 不可能 |
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壓縮表適合那些建立並導入數據後,再也不進行修改操做的數據表。可使用myisampack
對MyISAM表進行壓縮,壓縮後不能修改,除非先將表解壓後修改數據,而後再壓縮。壓縮後,減小了磁盤空間佔用,所以減小了磁盤I/O,從而提高查詢性能。壓縮表支持可讀索引。
MyISAM最典型的性能問題是表鎖的問題,若是發現全部查詢都長期處於「Locked」狀態,那麼就表鎖的問題。
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儲存引擎
Memory儲存引擎
該引擎把數據表保存在內存中,數據表具備固定不變的數據行,所以它的檢索很是快,可是服務器斷電時,表的內容也隨之消失。若是須要快速訪問數據,並且這些數據不會被修改,重啓後丟失也不要緊,能夠考慮使用Memory存儲引擎。
特色:
適合使用的場景:
Falcon儲存引擎
NDB儲存引擎
該引擎是MySQL的集羣儲存引擎。
查看有哪些存儲引擎可用
mysql> SHOW ENGINES\G;
查詢默認存儲引擎
mysql> SHOW VARIABLES LIKE 'default_storage_engine%';
查詢數據表的相關信息
mysql> SHOW TABLE STATUS LIKE 'user'\G;