MySQL学习笔记(7):存储引擎


本文更新于2019-06-23,使用MySQL 5.7,操作系统为Deepin 15.4。

和大多数数据库不同,插件式存储引擎是MySQL最重要的特性之一。

InnoDB

InnoDB表提供事务安全。

InnoDB表支持外键。创建外键时,要求父表必须有对应的索引,子表在创建外键时也会自动创建对应的索引。如父表被子表创建了外键索引,则父表的索引禁止被删除。在导入多个表的数据时,或在执行LOAD DATAALTER TABLE操作的时候,可以使用SET foreign_key_checks=0关闭外键检查。执行完后,使用SET foreign_key_checks=1重新打开。

InnoDB表自动增长列必需是索引,或组合索引的第一列。

InnoDB存储表和索引有以下两种方式:

  • 使用共享表空间存储:表结构保存在.frm文件中,数据和索引保存在innodb_data_home_dirinnodb_data_file_path定义的表空间中,可以是多个文件。
  • 使用多表空间存储:表结构保存在.frm文件中,每个表的数据和索引单独保存在.ibd文件中。如果是分区表,则每个分区对应单独的.ibd文件,文件名为“表名+分区名”,可以在创建分区的时候指定每个分区的文件位置。共享表空间仍然是必须的,InnoDB把内部数据词典和在线重做日志放在共享表空间中。

使用参数innodb_file_per_table可指定是否使用多表空间存储,并在重启服务器后,只且只对新建的表生效。使用多表空间存储的表,不能直接复制.frm和.ibd文件进行恢复,因为没有共享表空间的数据字典信息。但如恢复表到原来的数据库,可使用ALTER TABLE tablename DISCARD TABLESPACEALTER TABLE tablename IMPORT TABLESPACE

InnoDB表没有表元数据的缓存(如行数,因而执行COUNT(*)较慢)。

MyISAM

MyISAM表不支持事务,也不支持外键。

MyISAM表自动增长列可为组合索引的非第一列。

每个MyISAM在磁盘上存储成3个文件,数据文件和索引文件可以放置在不同的目录(需在创建表时通过DATA DIRECTORYINDEX 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 ... SELECTLOAD DATA INFILE写入文件中,就可在服务启动时从持久稳固的数据源装载表。定义MEMORY表的时候可通过MAX_ROWS指定表的最大行数。

NDB

NDB存储引擎在MySQL Cluster中使用。

常用存储引擎对比

特点 InnoDB MyISAM MERGE MEMORY NDB
存储限制 64TB 没有
事务安全 支持
锁机制 行锁 表锁 表锁 表锁 行锁
B树索引 支持 支持 支持 支持 支持
哈希索引 支持 支持
全文索引 支持
集群索引 支持
数据缓存 支持 支持 支持
索引缓存 支持 支持 支持 支持 支持
数据可压缩 支持
空间使用 N/A
内存使用 中等
批量插入速度
支持外键 支持

作者:garvenc,发布于:2020/06/30
原文:https://www.cnblogs.com/garvenc/p/mysql_learning_7_storage_engine.html