Documentation Home
MySQL 8.0 参考手册  / 第 13 章 SQL 语句  / 13.1 数据定义语句  / 13.1.20 CREATE TABLE 语句  /  13.1.17.1 CREATE TABLE 创建的文件

13.1.17.1 CREATE TABLE 创建的文件

MySQL 通过.frm 数据库目录中的表格式(定义)文件表示每个表。表的存储引擎也可能创建其他文件。

对于InnoDB表,文件存储由 innodb_file_per_table 配置选项控制。InnoDB对于打开此选项时创建 的每个表,表数据和所有关联的索引都存储在位于数据库目录内的.ibd 文件中。关闭此选项时,所有 InnoDB表和索引都存储在 系统表空间中,由一个或多个 ibdata* 文件表示。

对于MyISAM表,存储引擎创建数据和索引文件。因此,对于每个MyISAMtbl_name,有三个磁盘文件。

文件 目的
tbl_name.frm 表格格式(定义)文件
tbl_name.MYD 数据文件
tbl_name.MYI 索引文件

第 15 章,替代存储引擎,描述了每个存储引擎创建哪些文件来表示表。如果表名包含特殊字符,则表文件的名称包含这些字符的编码版本,如 第 9.2.4 节,“标识符到文件名的映射”中所述。

.frm 文件结构施加的限制

如前所述,每个表都有一个 .frm包含表定义的文件。服务器使用以下表达式检查文件中存储的一些表信息是否超过 64KB 的上限:

if (info_length+(ulong) create_fields.elements*FCOMP+288+
    n_length+int_length+com_length > 65535L || int_count > 255)

文件中存储的 .frm根据表达式检查的信息部分不能超过 64KB 限制,因此如果表定义达到此大小,则无法添加更多列。

表达式中的相关因素是:

  • info_length是“屏幕”所需的空间 。这与 MySQL 的 Unireg 传承有关。

  • create_fields.elements是列数。

  • FCOMP17岁。

  • n_length是所有列名的总长度,包括每个名称一个字节作为分隔符。

  • int_lengthENUM与 列的值列表相关SET。在这种情况下,int并不意味着 整数”。意思是区间 ,是指 ENUMSET列的统称。

  • int_count是唯一 ENUMSET定义的数量。

  • com_length是列注释的总长度。

刚刚描述的表达式对允许的表定义有几个含义:

  • 使用长列名可以减少列的最大数量,包含 ENUMSET列或使用列注释也可以。

  • 一个表最多只能有 255 个唯一 定义ENUMSET定义。具有相同元素列表的列被认为与此限制相同。例如,如果一个表包含这两列,它们将计为一列(而不是两列),因为定义是相同的:

    e1 ENUM('a','b','c')
    e2 ENUM('a','b','c')
  • ENUMunique和 definitions 中元素名称的长度总和 SET计入 64KB 限制,因此尽管给定 ENUM列中元素数量的理论限制为 65,535,但实际限制小于 3000。