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 tablespace、file-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
では、内部的に各テーブルのエントリがデータディクショナリに追加されます。 このエントリには、データベース名が含まれます。 たとえば、テーブル t1
が test
データベースに作成されている場合、データベース名のデータディクショナリエントリは'test/t1'
です。 これは、同じ名前 (t1
) のテーブルを別のデータベースに作成でき、テーブル名が 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
テーブルに対して常に 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
テーブルのプロパティを表示するには、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 スキーマオブジェクトテーブル」を参照してください。