InnoDB
表使用 CREATE TABLE
语句创建;例如
Press CTRL+C to copyCREATE TABLE t1 (a INT, b CHAR (20), PRIMARY KEY (a)) ENGINE=InnoDB;
当 InnoDB
被定义为默认存储引擎时,ENGINE=InnoDB
子句不是必需的,它默认情况下就是默认存储引擎。但是,如果 CREATE TABLE
语句要在一个默认存储引擎不是 InnoDB
或未知的 MySQL 服务器实例上重放,则 ENGINE
子句很有用。您可以通过发出以下语句来确定 MySQL 服务器实例上的默认存储引擎
Press CTRL+C to copymysql> SELECT @@default_storage_engine; +--------------------------+ | @@default_storage_engine | +--------------------------+ | InnoDB | +--------------------------+
InnoDB
表默认情况下在每个表一个文件表空间中创建。要在 InnoDB
系统表空间中创建 InnoDB
表,请在创建表之前禁用 innodb_file_per_table
变量。要在通用表空间中创建 InnoDB
表,请使用 CREATE TABLE ... TABLESPACE
语法。有关更多信息,请参见 第 17.6.3 节,“表空间”.
InnoDB
表的行格式决定了其行在磁盘上的物理存储方式。InnoDB
支持四种行格式,每种格式都有不同的存储特性。支持的行格式包括 REDUNDANT
、COMPACT
、DYNAMIC
和 COMPRESSED
。DYNAMIC
行格式是默认格式。有关行格式特性的信息,请参见 第 17.10 节,“InnoDB 行格式”.
innodb_default_row_format
变量定义了默认行格式。表的行格式也可以使用 CREATE TABLE
或 ALTER TABLE
语句中的 ROW_FORMAT
表选项显式定义。参见 定义表的行格式.
建议您为创建的每个表定义一个主键。选择主键列时,请选择具有以下特征的列
被最重要的查询引用的列。
从不留空的列。
从不具有重复值的列。
插入后很少更改值的列。
例如,在一个包含有关人员信息的表中,您不会在 (firstname, lastname)
上创建主键,因为多个人的姓名可能相同,姓名列可能留空,有时人们会更改姓名。由于存在如此多的约束条件,通常没有明显的列集可用作主键,因此您可以创建一个新的列,其中包含数字 ID,以用作主键的全部或部分。您可以声明一个 自动递增 列,以便在插入行时自动填充递增的值
Press CTRL+C to copy# 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));
有关自动递增列的更多信息,请参见 第 17.6.1.6 节,“InnoDB 中的 AUTO_INCREMENT 处理”.
虽然表在没有定义主键的情况下也能正常工作,但主键与许多性能方面息息相关,是任何大型或频繁使用的表的关键设计方面。建议您始终在 CREATE TABLE
语句中指定主键。如果您创建表、加载数据,然后运行 ALTER TABLE
在之后添加主键,则该操作比在创建表时定义主键要慢得多。有关主键的更多信息,请参见 第 17.6.2.1 节,“聚簇索引和二级索引”。
要查看 InnoDB
表的属性,请发出一个 SHOW TABLE STATUS
语句
Press CTRL+C to copymysql> SHOW TABLE STATUS FROM test LIKE 't%' \G; *************************** 1. row *************************** Name: t1 Engine: InnoDB Version: 10 Row_format: Dynamic Rows: 0 Avg_row_length: 0 Data_length: 16384 Max_data_length: 0 Index_length: 0 Data_free: 0 Auto_increment: NULL Create_time: 2021-02-18 12:18:28 Update_time: NULL Check_time: NULL Collation: utf8mb4_0900_ai_ci Checksum: NULL Create_options: Comment:
有关 SHOW TABLE STATUS
输出的信息,请参见 第 15.7.7.37 节,“SHOW TABLE STATUS 语句”。
您还可以通过查询 InnoDB
信息架构系统表来访问 InnoDB
表属性
Press CTRL+C to copymysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME='test/t1' \G *************************** 1. row *************************** TABLE_ID: 1144 NAME: test/t1 FLAG: 33 N_COLS: 5 SPACE: 30 ROW_FORMAT: Dynamic ZIP_PAGE_SIZE: 0 SPACE_TYPE: Single INSTANT_COLS: 0
有关更多信息,请参见 第 17.15.3 节,“InnoDB INFORMATION_SCHEMA 架构对象表”。