Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.1Mb
EPUB - 7.5Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


14.6.1 InnoDB テーブルの作成

InnoDB テーブルを作成するには、特別な句を付けずに CREATE TABLE ステートメントを使用します。以前は、ENGINE=InnoDB 句が必要でしたが、InnoDB がデフォルトのストレージエンジンとなったため必要なくなりました。(デフォルトのストレージエンジンが MyISAM である MySQL 5.1 以前が実行されているサーバー上で、mysqldump またはレプリケーションを使用して CREATE TABLE ステートメントを再現する予定がある場合は、その句を引き続き使用できます。)

-- Default storage engine = InnoDB.
CREATE TABLE t1 (a INT, b CHAR (20), PRIMARY KEY (a));
-- Backward-compatible with older MySQL.
CREATE TABLE t2 (a INT, b CHAR (20), PRIMARY KEY (a)) ENGINE=InnoDB;

innodb_file_per_table の設定に応じて、InnoDB ではシステムテーブルスペース内またはテーブルごとの別個のテーブルスペース (.ibd ファイルで表されます) 内に、各テーブルおよび関連付けられた主キーインデックスが作成されます。MySQL では、MySQL データベースディレクトリの下にある test ディレクトリ内に、t1.frm および t2.frm ファイルが作成されます。内部的に、InnoDB 独自のデータディクショナリにテーブルのエントリが追加されます。このエントリには、データベース名が含まれます。たとえば、t1 テーブルが作成されるデータベースが test である場合、エントリは 'test/t1' となります。つまり、ほかのいくつかのデータベースに同じ名前 t1 のテーブルを作成でき、InnoDB 内部でテーブル名の競合は発生しません。

これらのテーブルのプロパティーを表示するには、SHOW TABLE STATUS ステートメントを発行します。

SHOW TABLE STATUS FROM test LIKE 't%' \G;

ステータスの出力には、これらの 1 番目のテーブルの行フォーマットプロパティーが「Compact」であることが表示されます。この設定は基本的な実験には適していますが、もっとも強力な InnoDB のパフォーマンス機能を活用するには、すぐに「Dynamic」「Compressed」などのその他の行フォーマットの使用に進んでください。これらの値を使用するには、最初に少しの設定が必要です。

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;

必ず、InnoDB テーブルごとに主キーを設定し、次のようなカラム (複数の場合あり) を指定してください。

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

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

  • 重複する値がない。

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

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


User Comments
  Posted by dan f on June 22, 2003
You might wonder as I did, "How do I find out if my table is InnoDB or not?"

See the docs on "SHOW TABLE STATUS", for example http://www.mysql.com/doc/en/SHOW_TABLE_STATUS.html.
  Posted by Otheus on July 13, 2006
In Mysql prior to v4 (3.23), you MUST use "TYPE = " instead of "ENGINE = ".
  Posted by Guy Baconniere on November 27, 2008
Convert all databases to InnoDB (except "mysql" and "information_schema").

#!/bin/bash

if [ ! -f "$HOME/.my.cnf" ]; then
echo "Please create a ~/.my.cnf first"
exit 1
fi

mysql -B -N -e "SHOW DATABASES" mysql \
| grep -E -v '^(mysql|information_schema)$' \
| while read database; do
mysql -B -N -e "SHOW TABLES" "$database" \
| while read table; do
echo "+ Converting Table $table ($database)"
mysql -B -N -e "ALTER TABLE $table ENGINE = InnoDB" "$database"
done
done

exit 0

  Posted by Ryan Hendrickson on April 25, 2012
If you have access to the information_schema, then you can do this:
#use information_schema;
#select TABLE_NAME, ENGINE from TABLES where TABLE_SCHEMA='db';
Sign Up Login You must be logged in to post a comment.