本文更新于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 | 低 |
内存使用 | 高 | 低 | 低 | 中等 | 高 |
批量插入速度 | 低 | 高 | 高 | 高 | 高 |
支持外键 | 支持 |