一般的にどのような列がインデックスとして適していますか? 質問する

一般的にどのような列がインデックスとして適していますか? 質問する

インデックスとは何ですか? また、インデックスを使用してデータベース内のクエリを最適化するにはどうすればよいですか?「インデックスについて学習しようとしているのですが、どの列が適切なインデックス候補になるのでしょうか? 具体的には、MS SQL データベースの場合ですか?

グーグルで調べたところ、私が読んだものはすべて、一般的に増加し一意である列が適切なインデックスを作成することを示しています (MySQL の auto_increment など)。これは理解していますが、私は MS SQL を使用しており、主キーに GUID を使用しているため、インデックスは GUID 列には役立たないようです...

ベストアンサー1

インデックスは、クエリの最適化とテーブルからの迅速な結果検索において重要な役割を果たします。最も重要なステップは、インデックスを作成する列を選択することです。インデックス作成を検討できる主な場所は 2 つあります。WHERE 句で参照される列と JOIN 句で使用される列です。簡単に言うと、特定のレコードを検索する必要がある列にインデックスを作成する必要があります。buyers という名前のテーブルがあり、SELECT クエリで以下のようにインデックスが使用されているとします。

SELECT
 buyer_id /* no need to index */
FROM buyers
WHERE first_name='Tariq' /* consider indexing */
AND last_name='Iqbal'   /* consider indexing */

「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 indexing */
WHERE
 first_name='Tariq' /* consider indexing */
AND
 last_name='Iqbal' /* consider indexing */

上記のクエリによると、first_name、last_name 列は WHERE 句にあるため、インデックスを作成できます。また、country テーブルの country_id という追加フィールドは JOIN 句にあるため、インデックス作成の対象として検討できます。したがって、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 日):

どのようなインデックス(良いものでも悪いものでも)でも、挿入と更新の時間が長くなります。

インデックス(インデックスの数とタイプ)に応じて結果が検索されます。インデックスのせいで検索時間が長くなる場合は、そのインデックスは不適切です。

どの本でもそうですが、「索引ページ」には章の開始ページ、トピックのページ番号の開始ページ、サブトピックのページの開始ページがあります。索引ページにいくらかの説明があると役立ちますが、より詳細な索引は混乱を招いたり、不安にさせたりする可能性があります。索引にもメモリがあります。

インデックスの選択は賢明に行う必要があります。すべての列にインデックスが必要なわけではないことに注意してください。

おすすめ記事