MySQL中的數據用各類不一樣的技術存儲在文件(或者內存)中。這些技術中的每一種技術都使用不一樣的存儲機制、索引技巧、鎖定水平而且最終提供普遍的不一樣的功能和能力。經過選擇不一樣的技術,可以得到額外的速度或者功能,從而改善應用的總體功能。mysql
若是在研究大量的臨時數據,也許須要使用內存存儲引擎。內存存儲引擎可以在內存中存儲全部的表格數據。又或許須要一個支持事務處理的數據庫(以確保事務處理不成功時數據的回退能力)。這些不一樣的技術以及配套的相關功能在MySQL中被稱做存儲引擎(也稱做表類型)。 sql
MySQL默認配置了許多不一樣的存儲引擎,能夠預先設置或者在MySQL服務器中啓用。能夠選擇適用於服務器、數據庫和表格的存儲引擎,以便在選擇如何存儲你的信息、如何檢索這些信息以及你須要你的數據結合什麼性能和功能的時候爲你提供最大的靈活性。選擇如何存儲和檢索數據的這種靈活性是MySQL爲何如此受歡迎的主要緣由。其它數據庫系統(包括大多數商業選擇)僅支持一種類型的數據存儲。數據庫
遺憾的是,其它類型的數據庫解決方案採起的「一個尺碼知足一切需求」的方式意味着你要麼就犧牲一些性能,要麼你就用幾個小時甚至幾天的時間詳細調整你的數據庫。使用MySQL,咱們僅須要修改咱們使用的存儲引擎就能夠了安全
mysql5.6支持的存儲引擎包括InnoDB、MyISAM、MEMORY、CSV、BLACKHOLE、FEDERATED、MRG_MYISAM、ARCHIVE、PERFORMANCE_SCHEMA。其中NDB和InnoDB提供事務安全表,其餘存儲引擎都是非事務安全表。服務器
存儲引擎的特性:併發
併發性:某些應用程序比其餘應用程序具備不少的顆粒級鎖定要求(如行級鎖定)。 事務支持:並不是全部的應用程序都須要事務,但對的確須要事務的應用程序來講,有着定義良好的需求,如ACID兼容等。 引用完整性:經過DDL定義的外鍵,服務器須要強制保持關聯數據庫的引用完整性。 物理存儲:它包括各類各樣的事項,從表和索引的總的頁大小,到存儲數據所需的格式,到物理磁盤。 索引支持:不一樣的應用程序傾向於採用不一樣的索引策略,每種存儲引擎一般有本身的編制索引方法,但某些索引方法(如B-tree索引)對幾乎全部的存儲引擎來講是共同的。 內存高速緩衝:與其餘應用程序相比,不一樣的應用程序對某些內存高速緩衝策略的響應更好,所以,儘管某些內存高速緩衝對全部存儲引擎來講是共同的(如用於用戶鏈接的高速緩衝,MySQL的高速查詢高速緩衝等),其餘高速緩衝策略僅當使用特殊的存儲引擎時才惟必定義。 性能幫助:包括針對並行操做的多I/O線程,線程併發性,數據庫檢查點,成批插入處理等。 其餘目標特性:可能包括對地理空間操做的支持,對特定數據處理操做的安全限制等。
存儲引擎簡單介紹分佈式
InnoDB MySQL5.6版本默認的存儲引擎。InnoDB 是一個事務安全的存儲引擎,它具有提交、回滾以及崩潰恢復的功能以保護用戶數據。InnoDB 的行級別鎖定以及 Oracle 風格的一致性無鎖讀提高了它的多用戶併發數以及性能。InnoDB 將用戶數據存儲在彙集索引中以減小基於主鍵的普通查詢所帶來的 I/O 開銷。爲了保證數據的完整性,InnoDB 還支持外鍵約束。 MyISAM 既不支持事務,也不支持外鍵,它的優點是訪問速度快,但表級鎖定限制了它在讀寫負載方面的性能,所以它常常應用於只讀或者以讀爲主的數據場景。 Memory 將全部數據存儲在內存中,多應用於對非關鍵數據由快速查找的場景;Memory類型的表訪問數據很是快,由於數據存放在內存中,而且默認使用HASH索引,可是一旦服務關閉,表中的數據就會丟失 BLACKHOLE 黑洞,相似於Unix的/dev/null,Archive只接收但不保存數據。對這種引擎的表的查詢經常返回一個空集。這種表能夠應用於DML語句須要發送到從服務器,但主服務器並不會保留這種數據的備份的主從配置中。 CSV 它的表是以逗號分隔的文本文件。CSV表容許以CSV格式導入導出數據,以相同的讀和寫的格式在腳本和應用之間交互數據。因爲CSV表沒有索引,最好是在普通操做中將數據放在InnoDB表裏,只有在導入或導出階段使用一下CSV表。 NDB(又名 NDBCLUSTER) 這種集羣數據引擎尤爲適合於須要最高程度的正常運行時間和可用性的應用。注意:NDB 存儲引擎在標準 MySql 5.6 版本里不被支持。目前可以支持MySql 集羣的版本有: 基於 MySql 5.1 的 MySQL Cluster NDB 7.1; 基於 MySql 5.5 的 MySQL Cluster NDB 7.2; 基於 MySql 5.6 的 MySQL Cluster NDB 7.3; 基於 MySql 5.6 的 MySQL Cluster NDB 7.4 目前正處於研發階段。 Merge 容許 MySql DBA 或開發者將一系列相同的 MyISAM 表進行分組,並把它們做爲一個對象進行引用。適用於超大規模數據場景,如數據倉庫。 Federated 提供了從多個物理機上聯接不一樣的 MySql 服務器來建立一個邏輯數據庫的能力。適用於分佈式或者數據市場的場景。 Example 這種存儲引擎用以保存闡明如何開始寫新的存儲引擎的 MySql 源碼的例子。它主要針對於有興趣的開發人員。這種存儲引擎就是一個啥事也不作的 "存根"。你可使用這種引擎建立表,可是你沒法向其保存任何數據,也沒法從它們檢索任何索引。
經常使用存儲引擎及其應用場景ide
Innodb:
用於事務處理應用程序,支持外鍵和行級鎖。若是對事物的完整性要求很高,且在併發條件下要求數據的一致性,數據操做除了插入和查詢以外,還包括不少更新和刪除操做,那麼InnoDB存儲引擎是比較合適的。
InnoDB除了有效的下降由刪除和更新致使的鎖定,還能夠確保事務的完整提交和回滾,對於相似計費系統或者財務系統等對數據準確要求性比較高的系統都是合適的選擇。
MyISAM:
若是應用是以讀和插入操做爲主,只有不多的更新和刪除操做,並對事務的完整性併發性要求不那麼高,能夠選擇MyISAM做爲存儲引擎。
Memory:
全部數據存儲在內存中,在須要快速定位記錄和其餘相似數據的狀況下,能夠極快的提供訪問,Memory的缺陷就是對錶的大小有限制,雖然數據庫由於異常終止的話數據能夠正常恢復,可是一旦數據庫關閉,存儲在內存中的數據都會丟失。
# 查看當前默認的搜索引擎 mysql> show variables like "default_storage_engine"; # 查詢當前數據庫支持的存儲引擎 mysql> show engine \G; # 指定存儲引擎建表 mysql> create table qiubai(id int(2), name varchar(16)) ENGINE=MyISAM; # 也可使用alter table語句來修改一個已經存在的表的存儲引擎 mysql> alter table qiubai engine=innodb; # 在配置文件中指定my.ini [mysqld] default-storage-engine=INNODB