使用CREATE TABLE语句可以创建InnoDB表。例如:
CREATE TABLE t1 (a INT, b CHAR (20), PRIMARY KEY (a)) ENGINE=InnoDB;
如果InnoDB是默认存储引擎,就不需要指定ENGINE=InnoDB。但是,如果在另一个默认存储引擎不是InnoDB的MySQL实例中重放create table语句,ENGINE子句是有效的。你可以通过下面的语句来查看当前MySQL实例的默认存储引擎:
mysql> SELECT @@default_storage_engine;
+--------------------------+
| @@default_storage_engine |
+--------------------------+
| InnoDB |
+--------------------------+
InnoDB默认使用独立表空间。要在系统表空间中创建一张InnoDB表,在创建表之前禁用innodb_file_per_table变量。要在一个通用表空间中创建表,使用create table … tablespace语法。想了解更多信息,请查阅15.6.3,“表空间”。
行格式 #
一张InnoDB表的行格式决定了它的记录在磁盘上的物理存储方式。InnoDB支持4种行格式,每种格式都有不同的存储特性。这4种格式包括REDUNDANT, COMPACT, DYNAMIC, 和COMPRESSED。默认的行格式是DYNAMIC。想了解更多关于行格式特性的信息,请查阅15.10,“InnoDB行格式”。
innodb_default_row_format变量定义了默认的行格式。也可以在create table或alter table语句中使用row_format选项来显式指定行格式。见定义一张表的行格式。
主键 #
建议在创建表时指定一个主键。在选择主键列时,根据以下特性来选择列:
- 大多数重要查询使用到的列。
- 永远不会置为空的列。
- 没有重复键的列。
- 插入后更新少的列。 例如,有一张包含人员信息的表,你不能在(firstname, lastname)上创建主键,因为多个用户的姓名可能相同,name列可能被留空,而且有时一些用户会修改它们的姓名。有这么多的限制,很多时候没有一个可用于主键的列的集合,所以你可以创建一个数字列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));
想了解更多关于自增列的信息,请查阅15.6.1.6。
虽然不指定主键,表也可以正常工作,但是对于大表和经常访问的表来说,主键对于性能很重要。建议总是在使用create table创建表的时候定义主键。如果你创建表,装载数据,然后再运行alter table语句来添加主键索引,这个操作会比在创建表时定义主键慢的多。想了解关于主键的信息,请查阅15.6.2.1,“聚簇索引和二级索引”。
查询InnoDB表属性 #
可以通过 show table status语句来查看一张innodb表的属性:
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 输出的信息,请查阅13.7.7.38,“SHOW TABLE STATUS Statement”。
你也可以通过查询information_schema.innodb_tables表来查看表的属性:
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
想了解更多信息,请查阅15.15.3,“InnoDB INFORMATION_SCHEMA数据库对象表”。