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