InnoDB
表使用 CREATE TABLE
语句创建;例如:
CREATE TABLE t1 (a INT, b CHAR (20), PRIMARY KEY (a)) ENGINE=InnoDB;
如果 InnoDB
是默认存储引擎(默认情况下是这样),则不需要 ENGINE=InnoDB
子句。但是,如果要在不同的 MySQL 服务器实例上重放 CREATE TABLE
语句,而该实例的默认存储引擎不是 InnoDB
或未知,则 ENGINE
子句非常有用。你可以通过发出以下语句来确定 MySQL 服务器实例的默认存储引擎:
mysql> 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
定义了默认行格式。表的行格式也可以使用 ROW_FORMAT
表选项在 CREATE TABLE
或 ALTER 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));
有关自动递增列的更多信息,请参阅 第 17.6.1.6 节,“InnoDB 中的 AUTO_INCREMENT 处理”。
尽管表可以在没有定义主键的情况下正常工作,但主键与性能和大型或频繁使用的表的设计方面息息相关。建议始终在 CREATE TABLE
语句中指定主键。如果你创建表、加载数据,然后使用 ALTER TABLE
添加主键,那么该操作比在创建表时定义主键要慢得多。有关主键的更多信息,请参阅 第 17.6.2.1 节,“聚簇索引和辅助索引”。
要查看 InnoDB
表的属性,请发出 SHOW TABLE STATUS
语句:
mysql> 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.40 节,“SHOW TABLE STATUS 语句”。
您也可以通过查询 InnoDB
信息模式系统表来访问 InnoDB
表属性:
mysql> 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 模式对象表”。