2017-04-10 8 views
1

私はそれが次のシナリオでは二つの別々のインデックスを持っていることは理にかなっている場合を理解しようとしています:私なら、私が持っているインデックス、1列の共通

ColumnA, ColumnB, ColumnC 

1. where ColumnA = xxx and columnB = xxx 
2. where ColumnA = xxx and ColumnC = xxx 

を問い合わせますColumnAにある1つのインデックスのみを作成すると、両方のクエリに役立ちますか?または、ColumnA + ColumnBに2つのインデックスIndex1を作成し、ColumnA + ColumnCにIndex2を作成します。

2つのインデックスの方が優れていますが、インデックスの数を少なくすることをお勧めします。テーブルがかなり大きいので、columnAはかなりユニークです。 ColumnAは、特定のエンティティのデータをフィルタリングし、そのエンティティはそのデータのみを常に掘り下げることができます。

また、ColumnA + ColumnBにインデックスがあり、ColumnBが最初でColumnAが2番目のクエリがある場合は、このインデックスを使用しますか?

+0

"ColumnAに1つのインデックスしか作成していない場合は、両方のクエリで役立ちますか?" * ColumnBで1つのインデックスを作成する必要があるかどうか尋ねることを意味しますか?クエリには、ColumnAではなくColumnBが共通しています。 – Schwern

+0

申し訳ありませんが、私はミスタイプだと思います。 ColumnAは一般的です。 –

答えて

2

一般に、ColumnAにインデックスを作成すると、両方のクエリに役立ちます。ほとんどのRDBMSのもの(MSSQL、MySQLなど)のインデックスはbツリー構造です。このキーを使用すると、ラインを1つの方向のみですばやく見ることができます。 ColumnA成分がまだ最初のインデックスされるので

さらに、そのようなColumnA, ColumnCとして深いインデックスを作成することも、両方のクエリを助けるべきです。

ColumnBまたはColumnCを最もよく選択する列を評価し、ColumnAでインデックスを適用することをお勧めします。

例:ColumnBColumnAクエリのわずか10%でアクセスされ、一方ColumnCが90%にアクセスされたとします。この場合は、インデックスをColumnA, ColumnCに設定します。 ACクエリを100%助け、おそらく(私は100%はMySQLで確信していません)ABクエリにも役立ちます。 ABクエリ内のデータ(ただし、ColumnBコンポーネントのフルスキャンを実行しています)のデータです。

途中でこれらの種類のインデックスは、というインデックスを含むと呼ばれます。これは、クエリがインデックスデータに含まれる列のみを選択するためです(わずかな最適化です)。

最高の読み取りパフォーマンスは、2つのインデックス(各セットに1つ)ですが、正しく表示されているように、挿入、更新、および削除が少し遅くなります。あなたはほとんどの場合でも気付くはずです。

2

(@Haneyビューの一点からの質問を説明し、ここで別のである。)

2インデックスが「不良」ではありません。 10個のインデックスが「あまりにも多くのインデックス」の灰色の領域に入り込んでいます。

INDEX(A)は、両方のクエリでを助けます。

INDEX(A,B)はクエリの1つに非常に適していますが、を他のクエリで助けてください。単一のインデックスに保持したい場合は、これが最善の選択肢かもしれません。

しかし、BTEXTの場合、サイズ制限のためにINDEX(A,B)を使用することはできません。可能であれば、 "接頭辞" INDEX(A, B(22))を使用すると、INDEX(A)よりも優れているとは限りません。

INDEX(A,B,C)で気にしないでください。これはAとBのクエリには適していますが、もう1つのクエリではINDEX(A)よりも良くありません。

関連する問題