インデックスは、クエリの最適化とテーブルからの結果の迅速な検索において重要な役割を果たすことができます。したがって、インデックスを作成する列を選択することが最も重要なステップです。インデックス作成を検討できる主な場所は2つあります。WHERE句で参照される列とJOIN句で使用される列です。つまり、そのような列には、特定のレコードを検索するために必要なインデックスを付ける必要があります。 SELECTクエリが以下のようなインデックスを使用するbuyerという名前のテーブルがあるとします。
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 */
SELECT部分で「buyer_id」が参照されているため、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句にあるため、インデックスを付けることができます。また、国テーブルのcountry_idという追加のフィールドは、JOIN句に含まれているため、インデックス付けの対象と見なすことができます。したがって、WHERE句またはJOIN句のすべてのフィールドでインデックス付けを検討できます。
次のリストには、テーブルにインデックスを作成するときに常に覚えておく必要のあるいくつかのヒントも記載されています。
- WHERE句とORDERBY句で必要な列のみにインデックスを付けます。豊富な列にインデックスを付けると、いくつかの欠点が生じます。
- MySQLの「インデックスプレフィックス」または「複数列インデックス」機能を利用してみてください。 INDEX(first_name、last_name)などのインデックスを作成する場合は、INDEX(first_name)を作成しないでください。ただし、すべての検索ケースで「インデックスプレフィックス」または「複数列インデックス」が推奨されるわけではありません。
- インデックス付けを検討する列にはNOTNULL属性を使用して、NULL値が保存されないようにします。
- --log-long-formatオプションを使用して、インデックスを使用していないクエリをログに記録します。このようにして、このログファイルを調べ、それに応じてクエリを調整できます。
- EXPLAINステートメントは、MySQLがクエリを実行する方法を明らかにするのに役立ちます。これは、テーブルがどのように、どのような順序で結合されるかを示しています。これは、最適化されたクエリの記述方法や、列にインデックスを付ける必要があるかどうかを判断するのに非常に役立ちます。
更新(2015年2月23日):
インデックス(良い/悪い)があると、挿入と更新の時間が長くなります。
インデックス(インデックスの数とタイプ)に応じて、結果が検索されます。インデックスが原因で検索時間が長くなる場合は、それは悪いインデックスです。
どんな本でもそうですが、「索引ページ」には章の開始ページ、トピックページ番号の開始、サブトピックページの開始があります。インデックスページのいくつかの説明は役に立ちますが、より詳細なインデックスはあなたを混乱させたり怖がらせたりするかもしれません。インデックスにもメモリがあります。
インデックスの選択は賢明なはずです。すべての列にインデックスが必要なわけではないことに注意してください。