13.1.18.1 CREATE TABLE 创建的文件

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

对于在每个 table 文件 table 空间或常规 table 空间中创建的InnoDBtable,table 数据和关联的索引存储在数据库目录的.ibd file中。在系统 table 空间中创建InnoDBtable 时,table 数据和索引存储在 table 示系统 table 空间的ibdata* files中。 innodb_file_per_table选项控制默认情况下是在每 table 文件 table 空间中还是在系统 table 空间中创建 table。 TABLESPACE选项可用于将 table 放置在每 table 文件 table 空间,常规 table 空间或系统 table 空间中,而与innodb_file_per_table设置无关。

对于MyISAMtable,存储引擎创建数据和索引文件。因此,对于每个MyISAMtable* tbl_name *,存在三个磁盘文件。

FilePurpose
tbl_name.frmtable 格式(定义)文件
tbl_name.MYDData file
tbl_name.MYIIndex file

第 15 章,备用存储引擎,描述每个存储引擎创建的代 tabletable 的文件。如果 table 名包含特殊字符,则 table 文件的名称将包含这些字符的编码版本,如第 9.2.4 节“将标识符 Map 到文件名”中所述。

.frm 文件结构施加的限制

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

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

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

table 达式中的相关因素是:

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

  • create_fields.elements是列数。

  • FCOMP是 17.

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

  • int_lengthENUMSET列的值列 table 有关。在这种情况下,“ int”并不 table 示“整数”。它的意思是“间隔”,该术语统称为ENUMSET列。

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

  • com_length是列 Comments 的总长度。

刚刚描述的 table 达式对允许的 table 定义有一些含义:

  • 使用长列名可以减少最大列数,包括ENUMSET列,也可以使用列 Comments。

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

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