本文更新于2019-06-23,使用MySQL 5.7,,操作系統(tǒng)為Deepin 15.4,。
和大多數(shù)數(shù)據(jù)庫不同,插件式存儲引擎是MySQL最重要的特性之一,。
InnoDB
InnoDB表提供事務(wù)安全,。
InnoDB表支持外鍵。創(chuàng)建外鍵時(shí),要求父表必須有對應(yīng)的索引,,子表在創(chuàng)建外鍵時(shí)也會自動創(chuàng)建對應(yīng)的索引,。如父表被子表創(chuàng)建了外鍵索引,則父表的索引禁止被刪除,。在導(dǎo)入多個表的數(shù)據(jù)時(shí),,或在執(zhí)行LOAD DATA 或ALTER TABLE 操作的時(shí)候,可以使用SET foreign_key_checks=0 關(guān)閉外鍵檢查,。執(zhí)行完后,,使用SET foreign_key_checks=1 重新打開。
InnoDB表自動增長列必需是索引,,或組合索引的第一列,。
InnoDB存儲表和索引有以下兩種方式:
- 使用共享表空間存儲:表結(jié)構(gòu)保存在.frm文件中,數(shù)據(jù)和索引保存在
innodb_data_home_dir 和innodb_data_file_path 定義的表空間中,,可以是多個文件,。
- 使用多表空間存儲:表結(jié)構(gòu)保存在.frm文件中,每個表的數(shù)據(jù)和索引單獨(dú)保存在.ibd文件中,。如果是分區(qū)表,,則每個分區(qū)對應(yīng)單獨(dú)的.ibd文件,文件名為“表名+分區(qū)名”,,可以在創(chuàng)建分區(qū)的時(shí)候指定每個分區(qū)的文件位置,。共享表空間仍然是必須的,InnoDB把內(nèi)部數(shù)據(jù)詞典和在線重做日志放在共享表空間中,。
使用參數(shù)innodb_file_per_table 可指定是否使用多表空間存儲,,并在重啟服務(wù)器后,只且只對新建的表生效,。使用多表空間存儲的表,,不能直接復(fù)制.frm和.ibd文件進(jìn)行恢復(fù),因?yàn)闆]有共享表空間的數(shù)據(jù)字典信息,。但如恢復(fù)表到原來的數(shù)據(jù)庫,,可使用ALTER TABLE tablename DISCARD TABLESPACE 和ALTER TABLE tablename IMPORT TABLESPACE 。
InnoDB表沒有表元數(shù)據(jù)的緩存(如行數(shù),,因而執(zhí)行COUNT(*) 較慢),。
MyISAM
MyISAM表不支持事務(wù),也不支持外鍵,。
MyISAM表自動增長列可為組合索引的非第一列,。
每個MyISAM在磁盤上存儲成3個文件,數(shù)據(jù)文件和索引文件可以放置在不同的目錄(需在創(chuàng)建表時(shí)通過DATA DIRECTORY 和INDEX DIRECTORY 指定),。其文件名和表名相同,,擴(kuò)展名分別是:
- .frm:存儲表定義,。
- .MYD:MYData,存儲數(shù)據(jù),。
- .MYI:MYIndex,,存儲索引。
MyISAM表支持3種不同的存儲格式:
- 靜態(tài)表:默認(rèn)的存儲格式,,每條記錄都是固定長度的,。
- 動態(tài)表:記錄不是固定長度的,包含變長字段,。
- 壓縮表:由myisampack工具創(chuàng)建,,每條記錄都被單獨(dú)壓縮。
MyISAM表有表元數(shù)據(jù)的緩存(如行數(shù),,因而執(zhí)行COUNT(*) 較快),。
MERGE
MERGE表是一組MyISAM表的組合,這些MyISAM表必須結(jié)構(gòu)完全相同,。MERGE表本身并沒有數(shù)據(jù),,對其的任何操作實(shí)際上是對內(nèi)部MyISAM表進(jìn)行的??梢詫ERGE表進(jìn)行DROP 操作,其只是刪除表定義,,對內(nèi)部的表沒有影響,。
MERGE表在磁盤中保存兩個文件,文件名以表名開始,,.frm存儲表定義,,.MRG包含組合表的信息,包括MERGE表由哪些表組成,、插入新數(shù)據(jù)時(shí)的依據(jù),。可以通過修改.MRG文件來修改MERGE表,,但修改后需使用FLUSH TABLES 刷新,。
MEMORY
MEMORY表的數(shù)據(jù)放在內(nèi)存中,每個MEMORY表只對應(yīng)一個.frm磁盤文件,。
在啟動MySQL服務(wù)時(shí)使用--init-file 選項(xiàng),,把INSERT INTO ... SELECT 或LOAD DATA INFILE 寫入文件中,就可在服務(wù)啟動時(shí)從持久穩(wěn)固的數(shù)據(jù)源裝載表,。定義MEMORY表的時(shí)候可通過MAX_ROWS 指定表的最大行數(shù),。
NDB
NDB存儲引擎在MySQL Cluster中使用。
常用存儲引擎對比
特點(diǎn) |
InnoDB |
MyISAM |
MERGE |
MEMORY |
NDB |
存儲限制 |
64TB |
有 |
沒有 |
有 |
有 |
事務(wù)安全 |
支持 |
|
|
|
|
鎖機(jī)制 |
行鎖 |
表鎖 |
表鎖 |
表鎖 |
行鎖 |
B樹索引 |
支持 |
支持 |
支持 |
支持 |
支持 |
哈希索引 |
|
|
|
支持 |
支持 |
全文索引 |
|
支持 |
|
|
|
集群索引 |
支持 |
|
|
|
|
數(shù)據(jù)緩存 |
支持 |
|
|
支持 |
支持 |
索引緩存 |
支持 |
支持 |
支持 |
支持 |
支持 |
數(shù)據(jù)可壓縮 |
|
支持 |
|
|
|
空間使用 |
高 |
低 |
低 |
N/A |
低 |
內(nèi)存使用 |
高 |
低 |
低 |
中等 |
高 |
批量插入速度 |
低 |
高 |
高 |
高 |
高 |
支持外鍵 |
支持 |
|
|
|
|
|