CREATE [ONLINE|OFFLINE] [UNIQUE|FULLTEXT|SPATIAL] INDEXindex_name
[index_type
] ONtbl_name
(index_col_name
,...) [index_option
] ...index_col_name
:col_name
[(length
)] [ASC | DESC]index_type
: USING {BTREE | HASH | RTREE}index_option
: KEY_BLOCK_SIZE [=]value
|index_type
| WITH PARSERparser_name
CREATE INDEX
は、インデックスを作成するために
ALTER TABLE
ステートメントにマップされています。詳しくは項8.1.7. 「ALTER TABLE
構文」を参照してください。PRIMARY
KEY
を作成するために
CREATE INDEX
を使用することはできません。代わりに、ALTER
TABLE
を使用します。インデックスに関する更なる情報については、項4.4.4. 「MySQL におけるインデックスの使用」
を参照してください。
通常、テーブルが
CREATE TABLE
で作成されるときにテーブル上にすべてのインデックスを作成します。詳しくは項8.1.17. 「CREATE TABLE
構文」を参照してください。CREATE
INDEX
で既存テーブルにインデックスを追加することができます。
(col1,col2,...)
のカラムリストは複合カラムインデックスを作成します。インデックス値は与えられたカラムの値を結合することによって形作られます。
構文を使用してインデックス接頭辞長を指定することによって、カラム値の先頭の部分のみを使用するインデックスを作成できます。
col_name
(length
)
接頭辞は、CHAR
、VARCHAR
、BINARY
、および
VARBINARY
カラムに対して指定できます。
また、BLOB
および
TEXT
カラムもインデックス設定できますが、接頭辞長を指定する必要があります。
接頭辞長は、バイナリ以外の文字列型の場合は文字数で、バイナリ列型の場合はバイト単位で指定されます。これは、インデックスエントリは
CHAR
、VARCHAR
、そして
TEXT
カラムのそれぞれのカラム値の最初の
length
文字で、そして
BINARY
、VARBINARY
、そして
BLOB
カラムのそれぞれのカラム値の最初の
length
バイトで成り立っているということです。
この節のあとの方で説明するように、空間カラムの場合は接頭辞値を指定できません。
ここに表示されているステートメントは、name
カラムの最初の 10
文字を利用してインデックスを作成します。
CREATE INDEX part_of_name ON customer (name(10));
もしカラム内の名前の最初の 10
文字が違っていれば、このインデックスは
name
カラム全体から作成されたインデックスよりも遅くはないはずです。また、インデックスにカラム接頭辞を使用すると、インデックスファイルがはるかに小さくなるため、多くのディスク容量が節約されたり、INSERT
操作が高速化されたりする可能性もあります。
接頭辞のサポートや
(サポートされている場合の)
接頭辞の長さは、ストレージエンジンに依存します。たとえば、接頭辞の最大長は
MyISAM
テーブルでは
1000 バイト、InnoDB
テーブルでは 767
バイトです。NDBCLUSTER
ストレージエンジンは、接頭辞をサポートしていません
(Unsupported or Missing Features in MySQL Cluster
を参照)。
接頭辞の制限がバイト単位で測定されるのに対して、CREATE
INDEX
ステートメントの接頭辞長は、バイナリ以外のデータ型
(CHAR
、VARCHAR
、TEXT
)
では文字数として解釈されます。マルチバイトのキャラクタセットを利用するカラムの接頭辞長を指定するときにはこれを考慮に入れておいてください。
MySQL 5.1.7
からは、可変幅カラム上のインデックスはオンラインで作成されます。つまり、インデックスを作成するために、テーブルのコピーは必要なくなりました。NDBCLUSTER
テーブルの場合は、ほかの MySQL Cluster API
ノードからのアクセスに対してテーブルがロックされません。ただし、オンライン操作の期間中、同じ
API
ノード上のほかの操作に対してはロックされます。これは、サーバーが実行できると判断した場合は常にサーバーによって自動的に実行されます。これを実行させるために、特別な
SQL
構文やサーバーオプションを使用する必要はありません。
標準の MySQL 5.1
リリースでは、サーバーがインデックスをオンラインで作成することを決定したときに、そのサーバーの動作をオーバーライドすることはできません。
MySQL Cluster では、MySQL Cluster NDB 6.2.5 および MySQL
Cluster NDB 6.3.3
から、OFFLINE
キーワードを使用してインデックスをオフラインで作成できます
(これにより、クラスタ内のすべての API
ノードに対してテーブルがロックされる)。オンラインの
CREATE OFFLINE INDEX
および CREATE ONLINE INDEX
を管理する規則と制限は、ALTER
OFFLINE TABLE ... ADD INDEX
および
ALTER ONLINE TABLE ... ADD
INDEX
に対するものと同じです。ONLINE
キーワードを使用して、通常はオフラインで作成されるインデックスのオンラインでの作成を実行させることはできません
(CREATE INDEX
操作をオンラインで実行できない場合、ONLINE
キーワードは無視される)。詳細は
項8.1.7. 「ALTER TABLE
構文」 をご覧ください。
ONLINE
および
OFFLINE
キーワードは、MySQL Cluster NDB 6.2 および MySQL
Cluster NDB 6.3 リリースのそれぞれ、バージョン
6.2.5 および 6.3.3
からのみ使用できます。それ以前の MySQL Cluster
NDB 6.2 または 6.3 リリース、標準の MySQL 5.1
リリース、または MySQL Cluster NDB 6.1
リリースでこれらのキーワードを使用しようとすると、構文エラーが発生します。
UNIQUE
インデックスは、インデックス内のすべての値は明確でなければいけないというような制限を作成します。既存行とマッチするキー値の新しい行を追加しようとするとエラーが発生します。すべてのエンジンに対して、UNIQUE
インデックスは NULL
を含むことができるカラムの複数
NULL
値を許容します。UNIQUE
インデックス内のカラムの接頭辞値を指定する場合、カラム値は接頭辞内で一意である必要があります。
FULLTEXT
インデックスは MyISAM
テーブルにだけサポートされており、CHAR
、VARCHAR
、そして
TEXT
カラムだけを含むことができます。インデックス設定は常に、カラム全体に対して実行されます。カラム接頭辞のインデックス設定はサポートされていないため、接頭辞長が指定されても無視されます。
操作に関しての詳細は 項7.8. 「全文検索関数」
を参照してください。
MyISAM
、InnoDB
、NDB
、および
ARCHIVE
ストレージエンジンは、POINT
や GEOMETRY
などの空間カラムをサポートしています。(項7.13. 「空間拡張」
では、空間データ型について説明しています。)
ただし、空間カラムのインデックス設定に対するサポートはエンジンによって異なります。空間および非空間インデックスは、次の規則に従って使用できます。
空間インデックス (SPATIAL
INDEX
を使用して作成される):
MyISAM
テーブルでのみ使用できます。ほかのストレージエンジンで
SPATIAL INDEX
を指定すると、エラーが発生します。
インデックス設定されたカラムは、NOT
NULL
である必要があります。
MySQL 5.1 では、カラム接頭辞長は禁止されています。各カラムの幅全体がインデックス設定されます。
非空間インデックス
(INDEX
、UNIQUE
、または
PRIMARY KEY
で作成される):
ARCHIVE
を除き、空間カラムをサポートするすべてのストレージエンジンで許可されています。
インデックスが主キーでないかぎり、カラムを
NULL
にすることができます。
POINT
カラムを除く非
SPATIAL
インデックス内の空間カラムごとに、カラム接頭辞長を指定する必要があります。(これは、インデックス設定された
BLOB
カラムの場合と同じ要件です。)
接頭辞長は、バイト単位で指定されます。
非 SPATIAL
インデックスのインデックス型は、ストレージエンジンによって異なります。現在は、B
ツリーが使用されます。
MySQL 5.1 の場合:
もし
MyISAM
、InnoDB
、または
MEMORY
ストレージエンジンを利用していれば、そのときだけ
NULL
値を持つことができるカラム上にインデックスを追加することができます。
もし MyISAM
か InnoDB
ストレージエンジンを利用していれば、そのときだけ
BLOB
か
TEXT
カラム上にインデックスを追加することができます。
index_col_name
仕様は
ASC
か
DESC
で終わることができます。これらのキーワードは昇順や降順インデックス値ストレージを指定するための将来の拡張子として許容されます。現在は、それらは解析されますが無視されます。インデックス値は毎回昇順で格納されます。
MySQL 5.1.10
では、インデックスオプションは、インデックスカラムリストのあとに指定できます。index_option
値は次のうちのどれかになり得ます。
KEY_BLOCK_SIZE [=]
value
このオプションは、インデックスキーブロックに使用するバイト単位のサイズに関して、ストレージエンジンにヒントを提供します。このエンジンは必要に応じて値を変更することが可能です。0 という値は、デフォルト値を利用しなければいけないということを表しています。
index_type
いくつかのストレージエンジンでは、インデックスを作成するときに型を指定することができます。別々のストレージエンジンにサポートされた許容インデックス型は次のテーブルに表されています。複数インデックス型がリストされている部分に関しては、インデックス指定子が指示されていなければ最初のものがデフォルトです。
ストレージエンジン | 許容インデックス型 |
MyISAM |
BTREE 、RTREE
|
InnoDB |
BTREE |
MEMORY /HEAP
|
HASH 、BTREE
|
NDB |
HASH 、BTREE
(テキスト内の注記を参照) |
BTREE
インデックスは、NDBCLUSTER
ストレージエンジンによって T
ツリーインデックスとして実装されます。
NDBCLUSTER
テーブルカラム上のインデックスの場合、USING
節は、一意のインデックスまたは主キーに対してのみ指定できます。その場合は、USING
HASH
節によって、暗黙の順序付けられたインデックスの作成が回避されます。USING
HASH
を使用しない場合は、一意のインデックスまたは主キーを定義するステートメントによって、順序付けられたインデックスのほかに
HASH
インデックスが自動的に作成され、この両方によって同じカラムセットがインデックス作成されます。
RTREE
インデックス型は、SPATIAL
インデックスに対してのみ許容されます。
もし規定のストレージエンジンに対して正当ではないインデックス型を指定し、しかしクエリーに影響を与えずにそのエンジンが利用できる別の有効なインデックス型が存在すれば、エンジンはその有効な型を利用します。
例:
CREATE TABLE lookup (id INT) ENGINE = MEMORY; CREATE INDEX id_index USING BTREE ON lookup (id);
TYPE
は、type_name
USING
の同義語として認識されます。しかし、type_name
USING
が好ましい形です。
MySQL 5.1.10
より前のバージョンでは、このオプションは
ON
節の前にのみ指定できます。5.1.10
では、この位置でオプションを使用することは推奨されません。このサポートは、将来の
MySQL
リリースで削除される予定です。tbl_name
index_type
オプションが前とあとの両方の位置で指定された場合は、最後のオプションが適用されます。
WITHPARSER
parser_name
このオプションは
FULLTEXT
インデックスとだけ利用することができます。もしフルテキストインデックスと検索操作が特別対応を必要とするなら、これはインデックスを利用してパーサープラグインと提携します。プラグインの作成に関しての詳細はThe MySQL Plugin API
を参照してください。