インデックスは、クエリの最適化と、テーブルからの結果の迅速な検索に重要な役割を果たします。したがって、インデックスを作成する列を選択することが最も重要なステップです。インデックス作成を検討できる主要な場所は2つあります。WHERE句で参照される列とJOIN句で使用される列です。つまり、特定のレコードを検索する必要がある場合は、そのような列にインデックスを付ける必要があります。SELECTクエリが以下のようなインデックスを使用する、buyersという名前のテーブルがあるとします。
SELECT
buyer_id /* no need to index */
FROM buyers
WHERE first_name='Tariq' /* consider to use index */
AND last_name='Iqbal' /* consider to use index */
「buyer_id」はSELECT部分で参照されるため、MySQLは選択された行を制限するためにそれを使用しません。したがって、インデックスを作成する必要はあまりありません。以下は、上記とは少し異なる別の例です。
SELECT
buyers.buyer_id, /* no need to index */
country.name /* no need to index */
FROM buyers LEFT JOIN country
ON buyers.country_id=country.country_id /* consider to use index */
WHERE
first_name='Tariq' /* consider to use index */
AND
last_name='Iqbal' /* consider to use index */
上記のクエリfirst_nameによると、last_name列はWHERE句にあるため、インデックスを付けることができます。また、JOIN句に含まれているため、countryテーブルの追加フィールドcountry_idをインデックス作成の対象とすることができます。したがって、WHERE句またはJOIN句のすべてのフィールドでインデックス作成を検討できます。
次のリストは、テーブルにインデックスを作成する場合に常に留意する必要があるいくつかのヒントも示しています。
- WHERE句とORDER BY句で必要な列のみにインデックスを付けます。豊富な列のインデックスを作成すると、いくつかの欠点が生じます。
- MySQLの「インデックスプレフィックス」または「マルチカラムインデックス」機能を利用してみてください。INDEX(first_name、last_name)などのインデックスを作成する場合は、INDEX(first_name)を作成しないでください。ただし、「インデックスプレフィックス」または「マルチカラムインデックス」は、すべての検索ケースで推奨されるわけではありません。
- インデックス作成を検討する列にはNOT NULL属性を使用して、NULL値が格納されないようにします。
- --log-long-formatオプションを使用して、インデックスを使用していないクエリをログに記録します。このようにして、このログファイルを調べ、それに応じてクエリを調整できます。
- EXPLAINステートメントは、MySQLがクエリを実行する方法を明らかにするのに役立ちます。これは、テーブルが結合される方法と順序を示しています。これは、最適化されたクエリの記述方法や、列にインデックスを付ける必要があるかどうかを判断するのに非常に役立ちます。
アップデート(2015年2月23日):
インデックス(良好/不良)があると、挿入と更新の時間が長くなります。
インデックス(インデックスの数とタイプ)に応じて、結果が検索されます。インデックスが原因で検索時間が長くなる場合、それは悪いインデックスです。
どんな本でもそうであるように、「インデックスページ」は章の開始ページ、トピックページ番号の開始、サブトピックページの開始を含むことができます。インデックスページのいくつかの説明は役立ちますが、より詳細なインデックスはあなたを混乱させたり、怖がらせたりする可能性があります。インデックスにもメモリがあります。
インデックスの選択は賢明でなければなりません。すべての列がインデックスを必要とするわけではないことに注意してください。