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