Documentation Home

14.6.1.1 创建 InnoDB 表

InnoDB表是使用 CREATE TABLE语句创建的;例如:

CREATE TABLE t1 (a INT, b CHAR (20), PRIMARY KEY (a)) ENGINE=InnoDB;

当定义为默认存储引擎ENGINE=InnoDB时不需要 该子句,默认情况下是这样。InnoDB但是, 如果语句要在默认存储引擎不是或未知的不同 MySQL 服务器实例上重播,ENGINE则该子句很有用 。您可以通过发出以下语句来确定 MySQL 服务器实例上的默认存储引擎: CREATE TABLEInnoDB

mysql> SELECT @@default_storage_engine;
+--------------------------+
| @@default_storage_engine |
+--------------------------+
| InnoDB                   |
+--------------------------+

InnoDB默认情况下,表是在 file-per-table 表空间中创建的。要InnoDBInnoDB系统表空间中创建表,请在创建表之前禁用该innodb_file_per_table 变量。有关详细信息,请参阅 第 14.6.3 节,“表空间”

.frm 文件

MySQL 将表的数据字典信息存储 在数据库目录中的.frm 文件中。与其他 MySQL 存储引擎不同, InnoDB还在系统表空间内的自己的内部数据字典中对有关表的信息进行编码。当 MySQL 删除表或数据库时,它会删除一个或多个.frm文件以及InnoDB数据字典中的相应条目。您不能InnoDB仅通过移动.frm 文件来在数据库之间移动表。有关移动InnoDB 表的信息,请参阅第 14.6.1.4 节,“移动或复制 InnoDB 表”

InnoDB 表和行格式

表的行格式InnoDB决定了它的行在磁盘上的物理存储方式。 InnoDB支持四种行格式,每种格式具有不同的存储特性。支持的行格式包括 REDUNDANTCOMPACTDYNAMICCOMPRESSED。行COMPACT格式是默认的。有关行格式特征的信息,请参阅 第 14.11 节,“InnoDB 行格式”

尽管COMPACT行格式适用于基本实验,但请考虑使用 DYNAMICorCOMPRESSED行格式以利用InnoDB表压缩和长列值的高效页外存储等功能。

表的行格式是使用 or语句ROW_FORMAT中的表选项定义的。请参见 定义表格的行格式CREATE TABLEALTER TABLE

主键

建议您为创建的每个表定义一个主键。选择主键列时,选择具有以下特征的列:

  • 最重要的查询引用的列。

  • 永远不会留空的列。

  • 永远不会有重复值的列。

  • 插入后很少更改值的列。

例如,在包含有关人员信息的表中,您不会在上创建主键,(firstname, lastname)因为多个人可以有相同的名字,名称列可能留空,有时人们会更改他们的名字。有这么多约束,通常没有一组明显的列用作主键,因此您创建一个具有数字 ID 的新列作为全部或部分主键。您可以声明一个 自动递增列,以便在插入行时自动填充升序值:

# The value of ID can act like a pointer between related items in different tables.
CREATE TABLE t5 (id INT AUTO_INCREMENT, b CHAR (20), PRIMARY KEY (id));

# The primary key can consist of more than one column. Any autoinc column must come first.
CREATE TABLE t6 (id INT AUTO_INCREMENT, a INT, b CHAR (20), PRIMARY KEY (id,a));

有关自动增量列的更多信息,请参阅 第 14.6.1.6 节,“InnoDB 中的 AUTO_INCREMENT 处理”

尽管表在没有定义主键的情况下也能正常工作,但主键涉及性能的许多方面,对于任何大型或常用表来说都是至关重要的设计方面。建议您始终在CREATE TABLE语句中指定主键。如果你创建表,加载数据,然后运行 ALTER TABLE添加主键,那么这个操作比创建表时定义主键要慢得多。有关主键的更多信息,请参阅第 14.6.2.1 节,“聚簇索引和二级索引”

查看 InnoDB 表属性

要查看表的属性InnoDB,请发出SHOW TABLE STATUS 语句:

mysql> SHOW TABLE STATUS FROM test LIKE 't%' \G;
*************************** 1. row ***************************
           Name: t1
         Engine: InnoDB
        Version: 10
     Row_format: Compact
           Rows: 0
 Avg_row_length: 0
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2015-03-16 16:26:52
    Update_time: NULL
     Check_time: NULL
      Collation: latin1_swedish_ci
       Checksum: NULL
 Create_options:
        Comment:
1 row in set (0.00 sec)

有关SHOW TABLE STATUS输出的信息,请参阅 第 13.7.5.37 节,“SHOW TABLE STATUS 语句”

您还可以通过查询信息模式系统表 来访问InnoDB表属性:InnoDB

mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME='test/t1' \G
*************************** 1. row ***************************
     TABLE_ID: 42
         NAME: test/t1
         FLAG: 1
       N_COLS: 5
        SPACE: 24
  FILE_FORMAT: Antelope
   ROW_FORMAT: Compact
ZIP_PAGE_SIZE: 0
1 row in set (0.02 sec)

有关详细信息,请参阅 第 14.15.3 节,“InnoDB INFORMATION_SCHEMA 系统表”