能夠在 mysql 客戶端中,使用 show engines;
命令能夠查看MySQL支持的引擎:mysql
mysql> show engines; +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO | | 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 | NULL | NULL | NULL | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ 9 rows in set (0.06 sec)
InnoDB 是 MySQL 默認的存儲引擎,也是最重要、使用最普遍的存儲引擎。
InnoDB 的性能和自動崩潰恢復特性,使得它在非事務型存儲的需求中也很流行。
除非有很是特別的緣由須要使用其餘的存儲引擎,不然應該優先考慮 InnoDB 引擎。web
select count(*) from table
時須要全表掃描。使用共享表空間存儲: 表結構保存在 .frm
文件中,數據和索引在 innodb_data_home_dir
和 innodb_data_file_path
定義的表空間中,能夠是多個文件。
使用多表空間存儲: 表結構保存在 .frm
文件中,每一個表的數據和索引單獨保存在 .ibd
中。sql
更新密集的表: InnoDB存儲引擎特別適合處理多重併發的更新請求。
事務: InnoDB存儲引擎是支持事務的標準MySQL存儲引擎。
自動災難恢復: InnoDB表可以自動從災難中恢復。
外鍵約束: MySQL支持外鍵的存儲引擎只有InnoDB。
支持自動增長列 AUTO_INCREMENT 屬性。shell
MyISAM 是 MySQL 5.1 及以前版本的默認存儲引擎。MySQL 8 即將廢棄 MyISAM 引擎。
MyISAM 提供了全文索引、壓縮、空間函數(GIS)等特性。
MyISAM 不支持事務和行級鎖,崩潰後沒法安全恢復。數據庫
select count(*) from table
時只須要讀出該變量便可,速度很快。MyISAM 的三種存儲格式分別爲靜態、動態和壓縮。MyISAM 會根據表的定義自動選擇存儲格式。緩存
靜態表: 若是數據表中的各數據列的長度都是預先固定好的,服務器將自動選擇這種表類型。由於數據表中每一條記錄所佔用的空間都是同樣的,因此這種表存取和更新的效率很是高。當數據受損時,恢復工做也比較容易作。
動態表: 若是數據表中出現 varchar
、*text
或 *BLOB
字段時,服務器將自動選擇這種表類型。相對於靜態MyISAM,這種表存儲空間比較小,但因爲每條記錄的長度不一,因此屢次修改數據後,數據表中的數據就可能離散的存儲在內存中,進而致使執行效率降低。同時,內存中也可能會出現不少碎片。所以,這種類型的表要常常用 optimize table
命令或優化工具來進行碎片整理。
壓縮表: 以上說到的兩種類型的表均可以用myisamchk工具壓縮。若是表在建立並導入數據後,不在進行修改操做,這樣的表適合採用 MyISAM 壓縮表。這種類型的表進一步減少了佔用的存儲,可是這種表壓縮以後不能再被修改。另外,由於是壓縮數據,因此這種表在讀取的時候要先時行解壓縮。安全
每一個 MyISAM 表在磁盤上存儲成三個文件,每個文件的名字均以表的名字開始,擴展名指出文件類型。 .frm
文件存儲表結構定義。 .MYD
(MYData) 文件存儲表的數據。 .MYI
(MYIndex) 文件存儲表的索引。服務器
查詢密集型表: MyISAM 存儲引擎在篩選大量數據時很是快,是它最突出的優勢;
插入密集型表: MyISAM 的併發插入特性容許同時選擇、插入數據。例如:MyISAM存儲引擎很是適合管理郵件或Web服務器日誌數據。併發
MEMORY 引擎(也叫 HEAP 引擎),將全部數據都保存在內存中,不須要進行磁盤I/O。所以,MEMORY表至少比 MyISAM 錶快一個數量級。
MySQL 重啓或 mysqld 守護進程崩潰時,Memory 表的結構還會保留,可是全部的數據都會丟失。app
得到速度的同時也帶來一些缺陷。它要求存儲在Memory數據表裏的數據用的是長度不變的格式,這意味着不能用BLOB和TEXT這樣的長度可變的數據類型,VARCHAR是種長度可變的類型,但由於它在MySQL內部當作長度固定不變的CHAR類型,因此可使用。
ARCHIVE 引擎是一個針對插入和壓縮作了優化的簡單存儲引擎。
ARCHIVE 引擎只支持 INSERT 和 SELECT 操做。MySQL 5.1 以前也不支持索引。
ARCHIVE 引擎會利用 zlib 對插入的行進行壓縮,因此比 MyISAM 表的磁盤 I/O 更少。
MERGE 存儲引擎是 MyISAM 引擎的變種。MERGE 表是由多個 MyISAM 表合併而來的虛擬表,這些MyISAM表結構必須徹底相同。Merge表中並無數據,對Merge類型的表能夠進行查詢、更新、刪除操做,這些操做其實是對內部的MyISAM表進行操做。
Merge存儲引擎使用場景對於服務器日誌這種信息,通常經常使用的存儲策略是將數據分紅不少表,每一個名稱與特定時間端相關。例如:能夠用12個相同的表來存儲服務器的日誌數據,每一個表用對應各個月份的名字來命名。當有必要基於全部12個日誌表的數據來生成報表時,這意味着須要編寫、更新多表查詢,以反映這些表中的信息。與其編寫這些可能會出現錯誤的查詢,不如將這些表合併起來使用一條查詢,以後再刪除Merge表而不影響原來的數據,刪除Merge表只會刪除掉Merge表的定義,對內部表沒有任何影響。
可是引入分區功能後,該引擎已經被放棄。
CSV 引擎能夠將普通的 CSV 文件做爲 MySQL 的表來處理,可是這種表不支持索引。