CREATE [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}index_option: KEY_BLOCK_SIZEvalue|index_type| WITH PARSERparser_name
CREATE INDEX は、インデックスを作成する為に ALTER TABLE ステートメントにマップされています。詳しくは 項 「ALTER TABLE 構文」 を参照してください。インデックスに関する更なる情報については、 項 「MySQLにおけるインデックスの使用」 を参照してください。
通常、テーブルが CREATE TABLE で作成される時にテーブル上に全てのインデックスを作成します。詳しくは 項 「CREATE TABLE 構文」 を参照してください。CREATE INDEX で既存テーブルにインデックスを追加する事ができます。
(col1,col2,...) のカラム リストは複合カラム インデックスを作成します。インデックス値は与えられたカラムの値を結合する事によって形作られます。
CHAR、VARCHAR、BINARY、そして VARBINARY カラムには、インデックス プリフィックス長を指定する為に col_name(length) 構文を利用して、カラム値の最初に部分だけを利用するインデックスを作成する事ができます。BLOB と TEXT カラムもまたインデックスする事ができますが、プリフィックス長を与える 必要があります。。プリフィックス長は非バイナリ文字列タイプには文字で指定され、バイナリ文字列タイプにはバイトで指定されます。これは、インデックス エントリはCHAR、VARCHAR、そして TEXT カラムのそれぞれのカラム値の最初の length 文字で、そして BINARY、 VARBINARY、そして BLOB カラムのそれぞれのカラム値の最初の length バイトで成り立っているという事です。
ここに表示されているステートメントは、 name カラムの最初の10文字を利用してインデックスを作成します。
CREATE INDEX part_of_name ON customer (name(10));
もしカラム内の名前の最初の10文字が違っていれば、このインデックスは name カラム全体から作成されたインデックスよりも遅くは無いはずです。また、部分的なカラムをインデックスに利用する事でインデックス ファイルを小さくする事ができるので、ディスクのスペースを節約し、
INSERT 操作を早くする事ができます。
プリフィックスは最高で1000バイトの長さまで可能です。(InnoDB テーブルは767バイト)非バイナリ データ タイプ(CHAR、VARCHAR、TEXT)では CREATE INDEX ステートメントのプリフィックス長は文字数で解釈される一方、プリフィックス リミットはバイトで計算されるという事を覚えておいて下さい。マルチバイトの文字セットを利用するカラムのプリフィックス長を指定する時にはこれを考慮に入れておいて下さい。
UNIQUE インデックスは、インデックス内の全ての値は明確でなければいけないというような制限を作成します。既存行とマッチするキー値の新しい行を追加しようとするとエラーが発生します。全てのエンジンに対して、UNIQUE インデックスは NULL を含む事ができるカラムの複数 NULL 値を許容します。
FULLTEXT インデックスは MyISAM テーブルにだけサポートされており、CHAR、VARCHAR、そして TEXT カラムだけを含む事ができます。インデックスする作業は必ずカラム全体に対して行われますので、部分的インデックスはサポートされておらず、プリフィックス長を指定しても無視されます。操作に関しての詳細は
項11.7. 「全文検索関数」 を参照してください。
SPATIAL インデックスは MyISAM テーブルに対してだけサポートされており、 NOT NULL として定義された空間カラムだけを含む事ができます。章 16. Spatial Extensionsで空間データタイプについて説明されています。
MySQL 5.1 内では
もし MyISAM、 InnoDB、または MEMORY ストレージエンジンを利用していれば、その時だけNULL 値を持つ事ができるカラム上にインデックスを追加する事ができます。
もし MyISAM か InnoDB ストレージエンジンを利用していれば、その時だけBLOB かTEXTカラム上にインデックスを追加する事ができます。
index_col_name 仕様は ASC か DESC で終わる事ができます。これらのキーワードは昇順や降順インデックス値ストレージを指定する為の将来の拡張子として許容されます。現在は、それらは解析されますが無視されます。インデックス値は毎回昇順で格納されます。
インデックス カラム リストに続き、インデックス オプションが与えられます。index_option 値は次のうちのどれかになり得ます。
KEY_BLOCK_SIZE value
このオプションはインデックス キー ブロックに利用するサイズについてストレージ エンジンにヒントを提供します。このエンジンは必要に応じて値を変更する事が可能です。0という値は、デフォルト値を利用しなければいけないという事を表しています。KEY_BLOCK_SIZE は MySQL 5.1.10 で追加されました。
index_type
いくつかのストレージ エンジンでは、インデックスを作成する時にタイプを指定する事ができます。別々のストレージ エンジンにサポートされた許容インデックス タイプは次のテーブルに表されています。複数インデックス タイプがリストされている部分に関しては、インデックス指定子が指示されていなければ最初の物がデフォルトです。
| ストレージ エンジン | 許容インデックス タイプ |
MyISAM |
BTREE |
InnoDB |
BTREE |
MEMORY/HEAP |
HASH、BTREE |
もし規定のストレージ エンジンに対して正当ではないインデックス タイプを指定し、しかしクエリに影響を与えずにそのエンジンが利用できる別の有効なインデックス タイプが存在すれば、エンジンはその有効なタイプを利用します。
例:
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 tbl_name 条項の前にだけ指示する事ができました。このオプションのこの位置での利用は 5.1.10 以降は廃止予定で、MySQL 5.3 以降はサポートされなくなります。
WITH PARSER parser_name
このオプションは FULLTEXT インデックスとだけ利用する事ができます。もしフル テキスト インデックスと検索操作が特別対応を必要とするなら、これはインデックスを利用してパーサー
プラグインと提携します。プラグインの作成に関しての詳細は項25.2. 「The MySQL Plugin Interface」 を参照してください。