17.6.1.1 创建 InnoDB 表
InnoDB
表使用CREATE TABLE
语句创建,例如:
CREATE TABLE t1 (a INT, b CHAR (20), PRIMARY KEY (a)) ENGINE=InnoDB;
不需要在 ENGINE=InnoDB
子句中指定 InnoDB
,因为 InnoDB
是默认存储引擎。然而,如果要在不同的 MySQL 服务器实例上重新播放该语句,可以使用 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节,“Tablespaces”。
InnoDB 表的行格式确定了其行在磁盘上的物理存储方式。InnoDB 支持四种行格式,每种格式都具有不同的存储特征。支持的行格式包括 REDUNDANT
、COMPACT
、DYNAMIC
和 COMPRESSED
。默认的行格式是 DYNAMIC
。关于行格式特征的信息,请见第17.10节,“InnoDB Row Formats”。
变量innodb_default_row_format
确定了默认行格式。表的行格式也可以在CREATE TABLE
或ALTER TABLE
语句中使用 ROW_FORMAT
表选项。更多信息,请见Defining the Row Format of a 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.37节,“SHOW TABLE STATUS语句”。
你也可以通过查询InnoDB信息Schema系统表来访问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 Schema Object Tables”。