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_nameUSING
            
            の同義語として認識されます。しかし、type_nameUSING
            が好ましい形です。
          
            MySQL 5.1.10
            より前のバージョンでは、このオプションは
            ON
            
            節の前にのみ指定できます。5.1.10
            では、この位置でオプションを使用することは推奨されません。このサポートは、将来の
            MySQL
            リリースで削除される予定です。tbl_nameindex_type
            オプションが前とあとの両方の位置で指定された場合は、最後のオプションが適用されます。
          
            WITHPARSER
          parser_name
            このオプションは
            FULLTEXT
            インデックスとだけ利用することができます。もしフルテキストインデックスと検索操作が特別対応を必要とするなら、これはインデックスを利用してパーサープラグインと提携します。プラグインの作成に関しての詳細はThe MySQL Plugin API
            を参照してください。
          

