MySQL的這幾種存儲引擎你都瞭解嗎?

對於初學者來說我們通常不關注存儲引擎,但是 MySQL 提供了多個存儲引擎,包括處理事務安全表的引擎和處理非事務安全表的引擎。在 MySQL 中,不需要在整個服務器中使用同一種存儲引擎,針對具體的要求,可以對每一個表使用不同的存儲引擎。

存儲引擎簡介

MySQL中的數據用各種不同的技術存儲在文件(或者內存)中。這些技術中的每一種技術都使用不同的存儲機制、索引技巧、鎖定水平並且最終提供廣泛的不同的功能和能力。通過選擇不同的技術,你能夠獲得額外的速度或者功能,從而改善你的應用的整體功能。 存儲引擎說白了就是如何存儲數據、如何為存儲的數據建立索引和如何更新、查詢數據等技術的實現方法。

例如,如果你在研究大量的臨時數據,你也許需要使用內存存儲引擎。內存存儲引擎能夠在內存中存儲所有的表格數據。又或者,你也許需要一個支持事務處理的數據庫(以確保事務處理不成功時數據的回退能力)。

InnoDB

InnoDB是一個健壯的事務型存儲引擎,這種存儲引擎已經被很多互聯網公司使用,為用戶操作非常大的數據存儲提供了一個強大的解決方案。InnoDB還引入了行級鎖定和外鍵約束,在以下場合下,使用InnoDB是最理想的選擇:

更新密集的表。InnoDB存儲引擎特別適合處理多重併發的更新請求。事務。InnoDB存儲引擎是支持事務的標準MySQL存儲引擎。自動災難恢復。與其它存儲引擎不同,InnoDB表能夠自動從災難中恢復。外鍵約束。MySQL支持外鍵的存儲引擎只有InnoDB。支持自動增加列AUTO_INCREMENT屬性。從5.7開始innodb存儲引擎成為默認的存儲引擎。

一般來說,如果需要事務支持,並且有較高的併發讀取頻率,InnoDB是不錯的選擇。

MyISAM

MyISAM表是獨立於操作系統的,這說明可以輕鬆地將其從Windows服務器移植到Linux服務器;每當我們建立一個MyISAM引擎的表時,就會在本地磁盤上建立三個文件,文件名就是表名。例如,我建立了一個MyISAM引擎的tb_Demo表,那麼就會生成以下三個文件:

tb_demo.frm,存儲表定義。tb_demo.MYD,存儲數據。tb_demo.MYI,存儲索引。

MyISAM表無法處理事務,這就意味著有事務處理需求的表,不能使用MyISAM存儲引擎。MyISAM存儲引擎特別適合在以下幾種情況下使用:

1.選擇密集型的表。MyISAM存儲引擎在篩選大量數據時非常迅速,這是它最突出的優點。

2.插入密集型的表。MyISAM的併發插入特性允許同時選擇和插入數據。例如:MyISAM存儲引擎很適合管理郵件或Web服務器日誌數據。

MRG_MYISAM

MRG_MyISAM存儲引擎是一組MyISAM表的組合,老版本叫 MERGE 其實是一回事兒,這些MyISAM表結構必須完全相同,儘管其使用不如其它引擎突出,但是在某些情況下非常有用。說白了,Merge表就是幾個相同MyISAM表的聚合器;Merge表中並沒有數據,對Merge類型的表可以進行查詢、更新、刪除操作,這些操作實際上是對內部的MyISAM表進行操作。

Merge存儲引擎的使用場景。對於服務器日誌這種信息,一般常用的存儲策略是將數據分成很多表,每個名稱與特定的時間端相關。例如:可以用12個相同的表來存儲服務器日誌數據,每個表用對應各個月份的名字來命名。當有必要基於所有12個日誌表的數據來生成報表,這意味著需要編寫並更新多表查詢,以反映這些表中的信息。與其編寫這些可能出現錯誤的查詢,不如將這些表合併起來使用一條查詢,之後再刪除Merge表,而不影響原來的數據,刪除Merge表只是刪除Merge表的定義,對內部的表沒有任何影響。

ENGINE=MERGE,指明使用MERGE引擎,其實是跟MRG_MyISAM一回事兒,也是對的,在MySQL 5.7已經看不到MERGE了。UNION=(t1, t2),指明瞭MERGE表中掛接了些哪表,可以通過alter table的方式修改UNION的值,以實現增刪MERGE表子表的功能。比如:

alter table tb_merge engine=merge union(tb_log1) insert_method=last;

INSERT_METHOD=LAST,INSERT_METHOD指明插入方式,取值可以是:0 不允許插入;FIRST 插入到UNION中的第一個表; LAST 插入到UNION中的最後一個表。MERGE表及構成MERGE數據表結構的各成員數據表必須具有完全一樣的結構。每一個成員數據表的數據列必須按照同樣的順序定義同樣的名字和類型,索引也必須按照同樣的順序和同樣的方式定義。

MEMORY

使用MySQL Memory存儲引擎的出發點是速度。為得到最快的響應時間,採用的邏輯存儲介質是系統內存。雖然在內存中存儲表數據確實會提供很高的性能,但當mysqld守護進程崩潰時,所有的Memory數據都會丟失。獲得速度的同時也帶來了一些缺陷。它要求存儲在Memory數據表裡的數據使用的是長度不變的格式,這意味著不能使用BLOB和TEXT這樣的長度可變的數據類型,VARCHAR是一種長度可變的類型,但因為它在MySQL內部當做長度固定不變的CHAR類型,所以可以使用。

一般在以下幾種情況下使用Memory存儲引擎:

目標數據較小,而且被非常頻繁地訪問。在內存中存放數據,所以會造成內存的使用,可以通過參數max_heap_table_size控制Memory表的大小,設置此參數,就可以限制Memory表的最大大小。如果數據是臨時的,而且要求必須立即可用,那麼就可以存放在內存表中。存儲在Memory表中的數據如果突然丟失,不會對應用服務產生實質的負面影響。Memory同時支持散列索引和B樹索引。B樹索引的優於散列索引的是,可以使用部分查詢和通配查詢,也可以使用和>=等操作符方便數據挖掘。散列索引進行“相等比較”非常快,但是對“範圍比較”的速度就慢多了,因此散列索引值適合使用在=和
<>的操作符中,不適合在操作符中,也同樣不適合用在order by子句中。

CSV

CSV 存儲引擎是基於 CSV 格式文件存儲數據。

CSV 存儲引擎因為自身文件格式的原因,所有列必須強制指定 NOT NULL 。CSV 引擎也不支持索引,不支持分區。CSV 存儲引擎也會包含一個存儲表結構的 .frm 文件,還會創建一個 .csv 存儲數據的文件,還會創建一個同名的元信息文件,該文件的擴展名為 .CSM ,用來保存表的狀態及表中保存的數據量。每個數據行佔用一個文本行。

因為 csv 文件本身就可以被Office等軟件直接編輯,保不齊就有不按規則出牌的情況,如果出現csv 文件中的內容損壞了的情況,也可以使用 CHECK TABLE 或者 REPAIR TABLE 命令檢查和修復

ARCHIVE

Archive是歸檔的意思,在歸檔之後很多的高級功能就不再支持了,僅僅支持最基本的插入和查詢兩種功能。在MySQL 5.5版以前,Archive是不支持索引,但是在MySQL 5.5以後的版本中就開始支持索引了。Archive擁有很好的壓縮機制,它使用zlib壓縮庫,在記錄被請求時會實時壓縮,所以它經常被用來當做倉庫使用。

BLACKHOLE

黑洞存儲引擎,所有插入的數據並不會保存,BLACKHOLE 引擎表永遠保持為空,寫入的任何數據都會消失,

PERFORMANCE_SCHEMA

主要用於收集數據庫服務器性能參數。MySQL用戶是不能創建存儲引擎為PERFORMANCE_SCHEMA的表,一般用於記錄binlog做複製的中繼。

FEDERATED

主要用於訪問其它遠程MySQL服務器一個代理,它通過創建一個到遠程MySQL服務器的客戶端連接,並將查詢傳輸到遠程服務器執行,而後完成數據存取;在MariaDB的上實現是FederatedX

其他

這裡列舉一些其它數據庫提供的存儲引擎,OQGraph、SphinxSE、TokuDB、Cassandra、CONNECT、SQUENCE。提供的名字僅供參考。

常用引擎對比

不同存儲引起都有各自的特點,為適應不同的需求,需要選擇不同的存儲引擎,所以首先考慮這些存儲引擎各自的功能和兼容。

1.在服務器中實現(通過加密功能)。在其他表空間加密數據在MySQL 5.7或更高版本兼容。

2.在服務中實現的,而不是在存儲引擎中實現的。

3.在服務中實現的,而不是在存儲引擎中實現的。

4.地理位置索引,InnoDB支持可mysql5.7.5或更高版本兼容

查看存儲引擎

使用“SHOW VARIABLES LIKE '%storage_engine%';” 命令在mysql系統變量搜索磨人設置的存儲引擎,輸入語句如下:

mysql> SHOW VARIABLES LIKE '%storage_engine%'; +----------------------------------+---------+ | Variable_name | Value | |----------------------------------+---------| | default_storage_engine | InnoDB | | default_tmp_storage_engine | InnoDB | | disabled_storage_engines | | | internal_tmp_disk_storage_engine | InnoDB | +----------------------------------+---------+ 4 rows in set Time: 0.005s

使用“SHOW ENGINES;”命令顯示安裝以後可用的所有的支持的存儲引擎和默認引擎,後面帶上 \G 可以列表輸出結果,你可以嘗試一下如“SHOW ENGINES\G;”。

mysql> SHOW ENGINES; +--------------------+---------+--------------------------------------+-------------+--------+-----------+ | Engine | Support | Comment | Transactions| XA | Savepoints| |--------------------+---------+--------------------------------------+-------------+--------+-----------| | InnoDB | DEFAULT | Supports transactions, | YES | YES | YES | | | | row-level locking, and foreign keys | | | | | MRG_MYISAM | YES | Collection of identical MyISAM tables| NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful | NO | NO | NO | | | | for temporary tables | | | | | BLACKHOLE | YES | /dev/null storage engine (anything | NO | NO | NO | | | | you write to it disappears) | | | | | MyISAM | YES | MyISAM storage engine | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | ARCHIVE | YES | Archive storage engine | NO | NO | NO | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | | FEDERATED | NO | Federated MySQL storage engine | | | | +--------------------+---------+--------------------------------------+-------------+--------+-----------+

由上面命令輸出,可見當前系統的默認數據表類型是InnoDB。當然,我們可以通過修改數據庫配置文件中的選項,設定默認表類型。

設置存儲引擎

對上面數據庫存儲引擎有所瞭解之後,你可以在my.cnf 配置文件中設置你需要的存儲引擎,這個參數放在 [mysqld] 這個字段下面的 default_storage_engine 參數值,例如下面配置的片段

[mysqld] default_storage_engine=CSV

在創建表的時候,對錶設置存儲引擎,例如:

CREATE TABLE `user` ( `id` int(100) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(32) NOT NULL DEFAULT '' COMMENT '姓名', `mobile` varchar(20) NOT NULL DEFAULT '' COMMENT '手機', PRIMARY KEY (`id`) )ENGINE=InnoDB;

在創建用戶表 user 的時候,SQL語句最後 ENGINE=InnoDB 就是設置這張表存儲引擎為 InnoDB。

如何選擇合適的存儲引擎

提供幾個選擇標準,然後按照標準,選擇對應的存儲引擎即可。使用哪種引擎需要根據需求靈活選擇,一個數據庫中多個表可以使用不同的引擎以滿足各種性能和實際需求。使用合適的存儲引擎,將會提高整個數據庫的性能。

1.是否需要支持事務;

2.是否需要使用熱備;

3.崩潰恢復,能否接受崩潰;

4.是否需要外鍵支持;

5.存儲的限制;

6.對索引和緩存的支持;