もっとも一般的なインデックスの種類には、単一カラムがあり、データ構造にそのカラムの値のコピーを格納し、対応するカラム値のある行を高速にルックアップできます。 B ツリーデータ構造により、インデックスは、WHERE
句内の =
、>
、≤
、BETWEEN
、IN
などの演算子に対応する特定の値、値のセット、または値の範囲をすばやく見つけることができます。
テーブルあたりの最大インデックス数とインデックスの最大長は、ストレージエンジンごとに定義されます。 第15章「InnoDB ストレージエンジン」および第16章「代替ストレージエンジン」を参照してください。 すべてのストレージエンジンは、1 テーブルあたり 16 個以上のインデックスと 256 バイト以上の合計インデックス長をサポートします。 ほとんどのストレージエンジンでは、制限が高く設定されています。
カラムインデックスの詳細は、セクション13.1.15「CREATE INDEX ステートメント」 を参照してください。
文字列カラムのインデックス指定に
構文を使用すると、カラムの最初の col_name
(N
)N
文字のみを使用するインデックスを作成できます。 このようにカラム値のプリフィクスのみのインデックスを作成すると、インデックスファイルをかなり小さくできます。 BLOB
または TEXT
カラムにインデックス設定する場合、インデックスのプリフィクス長を指定する必要があります。 例:
CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
REDUNDANT
または COMPACT
の行形式を使用する InnoDB
テーブルでは、接頭辞の長さは最大 767 バイトです。 DYNAMIC
または COMPRESSED
の行形式を使用する InnoDB
テーブルでは、接頭辞の長さの制限は 3072 バイトです。 「MyISAM の場合」テーブルでは、接頭辞の長さの制限は 1000 バイトです。
接頭辞の制限はバイト単位で測定されますが、CREATE TABLE
、ALTER TABLE
および CREATE INDEX
ステートメントの接頭辞の長さは、非バイナリ文字列型 (CHAR
, VARCHAR
, TEXT
) の場合は文字数、バイナリ文字列型 (BINARY
, VARBINARY
, BLOB
) の場合はバイト数として解釈されます。 マルチバイト文字セットを使用する非バイナリ文字列カラムに接頭辞の長さを指定する場合は、これを考慮してください。
検索語がインデックス接頭辞の長さを超える場合、インデックスを使用して一致しない行が除外され、残りの行で一致の可能性が調査されます。
インデックス接頭辞の詳細は、セクション13.1.15「CREATE INDEX ステートメント」 を参照してください。
FULLTEXT
インデックスは、全文検索に使用されます。 InnoDB
および MyISAM
ストレージエンジンのみが、CHAR
、VARCHAR
、および TEXT
カラムに対してのみ、FULLTEXT
インデックスをサポートしています。 インデックス設定は常にカラム全体に対して行われ、カラムプリフィクスインデックス設定はサポートされていません。 詳細は、セクション12.10「全文検索関数」を参照してください。
最適化は、単一の InnoDB
テーブルに対する特定の種類の FULLTEXT
クエリーに適用されます。 これらの特性を持つクエリーは特に効率的です。
ドキュメント ID またはドキュメント ID と検索ランクのみを返す
FULLTEXT
クエリー。一致する行をスコアの降順でソートし、
LIMIT
句を適用して、上位 N 個の一致する行を取得するFULLTEXT
クエリー。 この最適化を適用するには、WHERE
句がなく、降順の単一のORDER BY
句のみがある必要があります。検索語に一致する行の
COUNT(*)
値のみを取得し、追加のWHERE
句がないFULLTEXT
クエリー。WHERE
句を> 0
比較演算子を使用せずに、WHERE MATCH(
とコーディングします。text
) AGAINST ('other_text
')
全文式を含むクエリーの場合、MySQL では、クエリー実行の最適化フェーズ中にこれらの式が評価されます。 オプティマイザは、全文式を参照して見積りを行うだけでなく、実行計画の開発プロセスでそれらを実際に評価します。
この動作の影響は、全文クエリーの EXPLAIN
は通常、最適化フェーズ中に式の評価が行われない非全文クエリーより遅くなることです。
全文クエリーの EXPLAIN
では、最適化中に一致が発生するため、Extra
カラムに Select tables optimized away
が表示される場合があります。この場合、後で実行する際にテーブルへのアクセスは必要ありません。