InnoDB磁盘结构之创建InnoDB表

65 阅读5分钟

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禁用该功能,则会InnoDBInnoDB系统表空间中隐式创建一个表。要在常规表空间中创建表,请使用 CREATE TABLE ... TABLESPACE语法。有关更多信息,请参见 “常规表空间”

创建InnoDB表时,MySQL 在MySQL数据目录下的数据库目录中创建一个.frm文件。有关.frm文件的更多信息,请参见 InnoDB表和.frm文件。对于在每个表文件表空间中创建的表,默认情况下,MySQL还在数据库目录中创建一个 .ibd表空间文件。在 InnoDB系统表空间中创建的表是在现有ibdata文件中创建的,该文件位于MySQL数据目录中。在常规表空间中创建的表在现有的常规表空间 .ibd文件中创建。常规表空间文件可以在MySQL数据目录内部或外部创建。有关更多信息,请参见 “常规表空间”

在内部,InnoDB将每个表的条目添加到InnoDB数据字典中。该条目包括数据库名称。例如,如果t1test 数据库中创建了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。 行格式DynamicCompressed行格式使您可以利用 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行格式的表,以及具有CompactRedundant行格式的表。

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还可以使用InnoDBInformation 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人工智能学习资料,大量后端学习资料等你来拿。

qrcode_for_gh_3214f9e3470a_258.jpg