InnoDB磁盘结构之创建InnoDB表
要创建InnoDB
表,请使用以下 CREATE TABLE
语句。
CREATE TABLE t1 (a INT, b CHAR (20), PRIMARY KEY (a)) ENGINE=InnoDB;
如果将ENGINE=InnoDB
子句InnoDB
定义为默认存储引擎(默认情况下为默认引擎),则无需指定该子句。要检查默认存储引擎,请发出以下语句:
mysql> SELECT @@default_storage_engine;
+--------------------------+
| @@default_storage_engine |
+--------------------------+
| InnoDB |
+--------------------------+
ENGINE=InnoDB
如果打算使用mysqldump或复制CREATE TABLE
在没有默认存储引擎的服务器上重播该语句, 则 可能仍使用子句InnoDB
。
一个InnoDB
表及其索引可以在创建系统表空间,在一个 文件中,每个表 的表空间,或在 一般的表空间。当innodb_file_per_table
启用,这是默认的,一InnoDB
台是隐含在一个单独的文件,每个表的表空间中创建。相反,如果 innodb_file_per_table
禁用该功能,则会InnoDB
在InnoDB
系统表空间中隐式创建一个表。要在常规表空间中创建表,请使用 CREATE TABLE ... TABLESPACE
语法。有关更多信息,请参见 “常规表空间”。
创建InnoDB
表时,MySQL 在MySQL数据目录下的数据库目录中创建一个.frm文件。有关.frm
文件的更多信息,请参见 InnoDB表和.frm文件。对于在每个表文件表空间中创建的表,默认情况下,MySQL还在数据库目录中创建一个 .ibd表空间文件。在 InnoDB
系统表空间中创建的表是在现有ibdata文件中创建的,该文件位于MySQL数据目录中。在常规表空间中创建的表在现有的常规表空间 .ibd文件中创建。常规表空间文件可以在MySQL数据目录内部或外部创建。有关更多信息,请参见 “常规表空间”。
在内部,InnoDB
将每个表的条目添加到InnoDB
数据字典中。该条目包括数据库名称。例如,如果t1
在test
数据库中创建了table ,则数据库名称的数据字典条目为 'test/t1'
。这意味着您可以t1
在不同的数据库中创建一个具有相同名称()的表,并且该表名不会在内部冲突InnoDB
。
InnoDB表和.frm文件
MySQL将表的数据字典信息存储在数据库目录中的 .frm文件中。与其他MySQL存储引擎不同, InnoDB
它还在系统表空间内的自身内部数据字典中编码有关表的信息。MySQL删除表或数据库时,将删除一个或多个.frm
文件以及InnoDB
数据字典中的相应条目。您不能InnoDB
仅通过移动.frm
文件在数据库之间移动表。有关移动InnoDB
表的信息,请参见“移动或复制InnoDB表”。
InnoDB表和行格式
InnoDB
表 的默认行格式由innodb_default_row_format
配置选项定义 ,其默认值为 DYNAMIC
。 行格式Dynamic
和 Compressed
行格式使您可以利用 InnoDB
表压缩和长列值的有效页外存储等功能。要使用这些行格式, innodb_file_per_table
必须启用(MySQL 5.6.6中的默认值),并且 innodb_file_format
必须将其设置为Barracuda。
SET GLOBAL innodb_file_per_table=1;
SET GLOBAL innodb_file_format=barracuda;
CREATE TABLE t3 (a INT, b CHAR (20), PRIMARY KEY (a)) ROW_FORMAT=DYNAMIC;
CREATE TABLE t4 (a INT, b CHAR (20), PRIMARY KEY (a)) ROW_FORMAT=COMPRESSED;
或者,您可以使用 CREATE TABLE ... TABLESPACE
语法InnoDB
在常规表空间中创建 表。常规表空间支持所有行格式。有关更多信息,请参见 “常规表空间”。
CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1 ROW_FORMAT=DYNAMIC;
CREATE TABLE ... TABLESPACE
语法也可以用于在系统表空间中创建 InnoDB
具有 Dynamic
行格式的表,以及具有Compact
或 Redundant
行格式的表。
CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE = innodb_system ROW_FORMAT=DYNAMIC;
有关InnoDB
行格式的更多信息,请参见“ InnoDB行格式”。有关如何确定InnoDB
表的行格式以及行格式的物理特征InnoDB
,请参见“ InnoDB行格式”。
InnoDB表和主键
始终为表定义一个主键InnoDB
,并指定一个或多个满足以下条件的列:
- 被最重要的查询引用。
- 永远不会空白。
- 永远不要有重复的值。
- 一旦插入,就很少更改值。
例如,在包含有关人员的信息的表中,您将不会在其上创建主键,(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));
尽管该表无需定义主键即可正常工作,但是主键涉及性能的许多方面,并且对于任何大型或经常使用的表而言都是至关重要的设计方面。建议您始终在CREATE TABLE
语句中指定主键。如果创建表,加载数据,然后稍后运行 ALTER TABLE
以添加主键,则该操作比创建表时定义主键要慢得多。
查看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 15:13:31
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
输出的信息,请参见 “ SHOW TABLE STATUS语句”。
InnoDB
还可以使用InnoDB
Information Schema系统表查询表属性:
mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME='test/t1' \G
*************************** 1. row ***************************
TABLE_ID: 45
NAME: test/t1
FLAG: 1
N_COLS: 5
SPACE: 35
FILE_FORMAT: Antelope
ROW_FORMAT: Compact
ZIP_PAGE_SIZE: 0
SPACE_TYPE: Single
1 row in set (0.00 sec)
有关更多信息,请参见 “ InnoDB INFORMATION_SCHEMA系统表”。
更多内容欢迎关注我的个人公众号“韩哥有话说”,100G人工智能学习资料,大量后端学习资料等你来拿。