MySQL 8.0 リファレンスマニュアル


15.6.1.1 InnoDB テーブルの作成

InnoDB テーブルを作成するには、CREATE TABLE ステートメントを使用します。

CREATE TABLE t1 (a INT, b CHAR (20), PRIMARY KEY (a)) ENGINE=InnoDB;

InnoDB がデフォルトのストレージエンジン (デフォルト) として定義されている場合は、ENGINE=InnoDB 句を指定する必要はありません。 デフォルトのストレージエンジンを確認するには、次のステートメントを発行します:

mysql> SELECT @@default_storage_engine;
+--------------------------+
| @@default_storage_engine |
+--------------------------+
| InnoDB                   |
+--------------------------+

mysqldump またはレプリケーションを使用して、デフォルトのストレージエンジンが InnoDB ではないサーバー上で CREATE TABLE ステートメントをリプレイする場合は、引き続き ENGINE=InnoDB 句を使用できます。

InnoDB テーブルとそのインデックスは、system tablespacefile-per-table テーブルスペースまたは general tablespace で作成できます。 innodb_file_per_table が有効な場合 (デフォルト)、InnoDB テーブルは個々の file-per-table テーブルスペースに暗黙的に作成されます。 逆に、innodb_file_per_table を無効にすると、InnoDB システムテーブルスペースに InnoDB テーブルが暗黙的に作成されます。 一般的なテーブルスペースにテーブルを作成するには、CREATE TABLE ... TABLESPACE 構文を使用します。 詳細は、セクション15.6.3.3「一般テーブルスペース」を参照してください。

file-per-table テーブルスペースにテーブルを作成すると、MySQL はデフォルトで、MySQL データディレクトリの下のデータベースディレクトリに .ibd テーブルスペースファイルを作成します。 InnoDB システムテーブルスペースに作成されたテーブルは、MySQL データディレクトリに存在する既存の ibdata file に作成されます。 一般テーブルスペースで作成されたテーブルは、既存の一般テーブルスペース .ibd file に作成されます。 一般的なテーブルスペースファイルは、MySQL データディレクトリの内外に作成できます。 詳細は、セクション15.6.3.3「一般テーブルスペース」を参照してください。

InnoDB では、内部的に各テーブルのエントリがデータディクショナリに追加されます。 このエントリには、データベース名が含まれます。 たとえば、テーブル t1test データベースに作成されている場合、データベース名のデータディクショナリエントリは'test/t1'です。 これは、同じ名前 (t1) のテーブルを別のデータベースに作成でき、テーブル名が InnoDB 内で衝突しないことを意味します。

InnoDB のテーブルと行の形式

InnoDB テーブルのデフォルトの行形式は、DYNAMIC のデフォルト値を持つ innodb_default_row_format 構成オプションによって定義されます。 Dynamic および Compressed の行形式を使用すると、テーブル圧縮や長いカラム値の効率的なオフページストレージなどの InnoDB 機能を利用できます。 これらの行フォーマットを使用するには、innodb_file_per_table を有効 (デフォルト) にする必要があります。

SET GLOBAL innodb_file_per_table=1;
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 テーブルを作成することもできます。 一般テーブルスペースでは、すべての行形式がサポートされます。 詳細は、セクション15.6.3.3「一般テーブルスペース」を参照してください。

CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1 ROW_FORMAT=DYNAMIC;

CREATE TABLE ... TABLESPACE 構文を使用して、Compact または Redundant 行形式のテーブルとともに、Dynamic 行形式の InnoDB テーブルをシステムテーブルスペースに作成することもできます。

CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE = innodb_system ROW_FORMAT=DYNAMIC;

InnoDB の行フォーマットの詳細は、セクション15.10「InnoDB の行フォーマット」 を参照してください。 InnoDB テーブルの行フォーマットおよび InnoDB の行フォーマットの物理特性を決定する方法は、セクション15.10「InnoDB の行フォーマット」 を参照してください。

InnoDB テーブルおよび主キー

InnoDB テーブルに対して常に primary key を定義し、次のようなカラムを指定します:

  • もっとも重要なクエリーで参照される。

  • ブランクのままになっていない。

  • 重複する値がない。

  • 挿入後に値が変更されるとしても、きわめてまれである。

たとえば、人に関する情報を含むテーブルでは、複数の人が同じ名前を持つ可能性もあり、名字をブランクにしたり、名前を変更したりする人もいるため、(名、姓) 上には主キーを作成しません。 制約が非常に多く、主キーとして使用する明確なカラムセットがないことも多い場合には、主キーの全部または一部として機能する数値 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: utf8mb4_0900_ai_ci
       Checksum: NULL
 Create_options:
        Comment:

SHOW TABLE STATUS 出力の詳細は、セクション13.7.7.38「SHOW TABLE STATUS ステートメント」 を参照してください。

InnoDB テーブルのプロパティは、InnoDB Information Schema システムテーブルを使用してクエリーすることもできます:

mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME='test/t1' \G
*************************** 1. row ***************************
     TABLE_ID: 45
         NAME: test/t1
         FLAG: 1
       N_COLS: 5
        SPACE: 35
   ROW_FORMAT: Compact
ZIP_PAGE_SIZE: 0
   SPACE_TYPE: Single

詳細は、セクション15.15.3「InnoDB INFORMATION_SCHEMA スキーマオブジェクトテーブル」を参照してください。


関連キーワード:  InnoDB, テーブル, スペース, 作成, TABLE, 構成, 圧縮, CREATE, 一般, INFORMATION