MySQL教程30-不同存储引擎的数据表在文件系统里是如何表示的?
MySQL 支持 InnoDB、MyISAM、Memory、Merge、Archive、CSV、BLACKHOLE 几种存储引擎,不同存储引擎的数据表在文件系统中的表示也各不相同。
MySQL 中的每一个数据表在磁盘上至少被表示为一个文件,即存放着该数据表结构定义的 .frm 文件。不同的存储引擎还有其它用来存放数据和索引信息的文件。
从 MySQL 8.0 版本开始,frm 表结构定义文件被取消,MySQL 把表结构信息都写到了系统表空间。
下面介绍不同存储引擎的数据表在文件系统中是如何表示的。
MyISAM
MyISAM 存储引擎的数据表在数据库目录里使用 3 个文件来代表,这些文件的基本名与数据表的名字相同,扩展名则表明了文件的具体用途。这三个文件的扩展名分别是:
.frm
:表结构定义文件,存放着该数据表的结构定义。.MYD
:MY Data 的缩写,数据文件,存放着该数据表中各个行的数据。.MYI
: MY Index 的缩写,索引文件,存放着该数据表的全部索引信息。
下面创建存储引擎为 MyISAM 的 tb_myisam 表,SQL 语句如下。
mysql> SET default_storage_engine=MyISAM; Query OK, 0 rows affected (0.02 sec) mysql> CREATE TABLE tb_myisam( -> id INT -> ); Query OK, 0 rows affected (0.03 sec)
本节中所有创建的不同存储引擎的表在文件系统(数据目录)中的表示在文章末尾展示。
MERGE
MERGE 存储引擎的数据表其实是一个逻辑结构。它代表着由一组结构完全相同的 MyISAM 数据表所构成的集合。有关的查询命令会把它当作一个大数据表来对待。
MERGE 存储引擎的数据表除了拥有存储表结构定义的 .frm 文件以外,还有一个扩展名为 .mgr 的文件,这个文件里不保存数据,而是数据的来源地。通俗的说,就是一份由多个 MyISAM 数据表的名单构成的 MERGE 数据表。
下面创建存储引擎为 MERGE 的 tb_merge 表,SQL 语句如下。
mysql> SET default_storage_engine=Merge; Query OK, 0 rows affected (0.00 sec) mysql> CREATE TABLE tb_merge( -> id INT -> ); Query OK, 0 rows affected (0.02 sec)
InnoDB
对于 InnoDB 存储引擎的数据表,一个表对应两个文件,一个是 *.frm,存储表结构信息;一个是 *.ibd,存储表中数据。
下面创建存储引擎为 InnoDB 的 tb_innodb 表,SQL 语句如下。
mysql> SET default_storage_engine=InnoDB; Query OK, 0 rows affected (0.00 sec) mysql> CREATE TABLE tb_innodb( -> id INT -> ); Query OK, 0 rows affected (0.10 sec)
Memory
Memory 存储引擎的数据表是创建在内存中的数据表。因为 MySQL 服务器把 Memory 数据表的数据和索引都存放在了内存中而不是硬盘上,所以除了相应的 .frm 文件外,Memory 引擎表在文件系统里没有其它相应的代表文件。
下面创建存储引擎为 Memory 的 tb_memory 表,SQL 语句如下。
mysql> SET default_storage_engine=Memory; Query OK, 0 rows affected (0.00 sec) mysql> CREATE TABLE tb_memory( -> id INT -> ); Query OK, 0 rows affected (0.03 sec)
Archive
Archive 存储引擎的数据表除了拥有 .frm 表结构定义文件外,还有一个扩展名为 .arz 的数据文件,用来存储历史归档数据。执行优化操作时可能还会出现一个扩展名为 .arn 的文件。
下面创建存储引擎为 Archive 的 tb_archive 表,SQL 语句如下。
mysql> SET default_storage_engine=Archive; Query OK, 0 rows affected (0.00 sec) mysql> CREATE TABLE tb_archive( -> id INT -> ); Query OK, 0 rows affected (0.04 sec)
CSV
与其它类型的存储引擎相同,CSV 引擎表也会包含一个 .frm 表结构定义文件,此外还会创建一个扩展名为 .CSV 的数据文件。这个文件是 CSV 格式的文本文件,用来保存表中的实际数据。
.CSV 文件可以直接在 Excel 中打开,或者是使用其它文件编辑工具查看。另外,还有一个同名的元信息文件,文件扩展名为 .CSM,用来保存表的状态及表中保存的数据量。
由于 CSV 文件可被直接编辑,如果操作得当,可以不通过 SQL 语句直接修改 CSV 文件中的内容。
CSV 存储引擎基于 CSV 格式文件存储数据,由于自身文件格式的原因,所有列必须强制指定 NOT NULL。
下面创建存储引擎为 CSV 的 tb_csv 表,SQL 语句如下。
mysql> SET default_storage_engine=csv; Query OK, 0 rows affected (0.02 sec) mysql> CREATE TABLE tb_csv( -> id INT NOT NULL, -> name CHAR(10) NOT NULL -> ); Query OK, 0 rows affected (0.04 sec)
BLACKHOLE
由于在 BLACKHOLE 存储引擎的数据表中写入任何数据都会消失,所以除了 .frm 文件,BLACKHOLE 引擎表没有其他相应的代表文件。
下面创建存储引擎为 BLACKHOLE 的 tb_blackhole 表,SQL 语句如下。
mysql> SET default_storage_engine=BLACKHOLE; Query OK, 0 rows affected (0.00 sec) mysql> CREATE TABLE tb_blackhole( -> id INT -> ); Query OK, 0 rows affected (0.03 sec)
下图是不同存储引擎的数据表在文件系统中的表示。