13.1.18.1 CREATE TABLE 创建的文件
MySQL 通过数据库目录中的.frm
table 格式(定义)文件 table 示每个 table。该 table 的存储引擎可能还会创建其他文件。
对于在每个 table 文件 table 空间或常规 table 空间中创建的InnoDB
table,table 数据和关联的索引存储在数据库目录的.ibd file中。在系统 table 空间中创建InnoDB
table 时,table 数据和索引存储在 table 示系统 table 空间的ibdata* files中。 innodb_file_per_table选项控制默认情况下是在每 table 文件 table 空间中还是在系统 table 空间中创建 table。 TABLESPACE
选项可用于将 table 放置在每 table 文件 table 空间,常规 table 空间或系统 table 空间中,而与innodb_file_per_table设置无关。
对于MyISAM
table,存储引擎创建数据和索引文件。因此,对于每个MyISAM
table* tbl_name
*,存在三个磁盘文件。
File | Purpose |
---|---|
tbl_name.frm |
table 格式(定义)文件 |
tbl_name.MYD |
Data file |
tbl_name.MYI |
Index 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_length
与ENUM和SET列的值列 table 有关。在这种情况下,“ int”并不 table 示“整数”。它的意思是“间隔”,该术语统称为ENUM和SET列。 -
com_length
是列 Comments 的总长度。
刚刚描述的 table 达式对允许的 table 定义有一些含义:
-
一个 table 最多只能有 255 个唯一的ENUM和SET定义。对于这种限制,具有相同元素列 table 的列被认为是相同的。例如,如果一个 table 包含这两列,由于定义相同,它们将计为该限制的一(而不是两):
e1 ENUM('a','b','c')
e2 ENUM('a','b','c')