MySQL学习笔记(7):存储引擎
本文更新于2019-06-23,使用MySQL 5.7,操作系统为Deepin 15.4。
目录
- InnoDB
- MyISAM
- MERGE
- MEMORY
- NDB
- 常用存储引擎对比
和大多数数据库不同,插件式存储引擎是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
低
内存使用
高
低
低
中等
高
批量插入速度
低
高
高
高
高
支持外键
支持
以上是 MySQL学习笔记(7):存储引擎 的全部内容, 来源链接: utcz.com/z/534368.html