2012-03-21 4 views
5

I持って、私が作成するかどうかを決定するために行わなければなら可能どのような考慮事項密接に関連する2つの列AとB:インデックス(A)とインデックス(B)、またはインデックス(A、B)、またはその両方を定義しますか?私のテーブルで

  • 指数(A)およびインデックス(B)を、
  • インデックス(A、 B)、
  • 上記の両方?

この変更は、Iない場合はどのように:where A = 5 and B = 10(と決してwhere A = 5など)のようなクエリのみ

  1. 使用、
  2. where A > 3 and A < 10 and B > 12 and B < 20のようなクエリを使用し、多くの場合、
  3. は使用order by (A, B)
  4. よくgroup by (A, B)を使用しますか?

注:他の人にも役立つ一般的な回答を希望しているため、私は意図的に私の特定のケースに関する詳細を提供していません。私はmysqlを使用していますが、一般的にSQLをカバーするより一般的な答えがあれば素晴らしいでしょう。

+0

私は[この質問]を読んだことに注意してください(http://stackoverflow.com/questions/2291193/mysql-difference-between-add-indexa-add-indexb-and-add-ind)私の質問のすべてをカバーしていない。 – TMS

+0

できるだけ多くのEXPLAINを使用し、さまざまなインデックス設定を試してください。それは非常に有益なはずです! – SirDarius

答えて

4

インデックス(A、B)がある場合は、インデックス(A)として使用することもできます。 ABとAを宣言することは意味がありません。 ABとBの宣言、しかし

ですから、これらの選択肢を持っているん:

  1. 指数(A、B)
  2. 指数(A、B)とインデックス(B)
  3. 指数(A)であなたは常に両方の列(またはインデックスの最初のもの)を使用する場合とインデックス(B)
+1

よかった、ありがとう!しかし、あなたは3つの選択肢、つまり 'Index(A、B)'だけを意味しますか? – TMS

+4

'A'カラムなしで' B'カラムを検索しない場合、 'Index(A、B)'だけを使うこともできます。覚えておくべきことは、** Index(A、B)はB単独では検索できないということです**。それは論理的です。姓、名字の辞書を考えてみましょう。そこに名字「トーマス」を持つすべての人々を見つけるのは難しいでしょう。 – Konerak

+0

Konerakに感謝します。しかし、クエリー2についてはどうでしょうか? 'A> 3とA < 10 and B > 12とB <20'? Bの個別指数が必要な場合はありませんか? – TMS

3

あなたWHERE/GROUP BY/ORDER BYあなたはindex(A,B)を使用する必要があります。

インデックスの2番目のもの(この場合はB)は別々に使用することはできませんが、最初のものは使用できます(いずれの場合も最初のもののみ)。

したがって、Bを単独で使用しない場合は、index(A,B)で十分です。 Aを単独で使用するのではなく、Bを使用する場合は、index(B,A)を実行します。両方を別々に使用する場合は、ほとんど一緒に使用し、別のインデックスを別々に追加します。

+0

ありがとうトパーナーですが、質問2はどうですか? 'A> 3とA < 10 and B > 12とB <20'? Bの個別指数が必要な場合はありませんか? – TMS

+0

は正しい@Tomasです –

1

あなたの例1、3、あなたがAにしてもBに範囲クエリを持っている場合2、4.

を処理する(A,B)上のインデックスは、それが(A)にインデックスを持つことが最善だ、と別のインデックスを(B)に設定し、クエリに最適なデータベースをデータベースに決定させます。これは、クエリの値に基づいてインデックスがより選択的であるかどうかを決定することができます。この場合、MySQLは1つのインデックスのみを使用します。したがって、指定された範囲の最小の行を与えると考えられるものを選択し、他の範囲でフィルタリングする行を処理します。

はあなたが言及した例すべてを処理するために、私は上のインデックスをお勧めします。

  • (A,B)
  • (B)

(A,B)上のインデックスはちょうど(A)上だけでインデックスのように使用することができますデータベースがただ(A)のインデックスを必要とするときはいつも、これらの2つのインデックスを定義することは、上記の「すべて」のセットを(A),(B)および(A,B)である。

(B, A)で注文またはグループ化する場合は、(B,A)のインデックスと(A,B)のインデックスが必要です。順序は重要です!

関連する問題