1

A、B、C、D の 4 つの列を持つテーブルがあるとします。

これらの列に対して句を結合または実行するいくつかのクエリがあるとします。

Q1: Where A = ?
Q2: Where A = ?, B = ?
Q3: Where A = ?, B = ?, C = ?

これらの列を 3 つの異なるコンテキストで使用することがわかっているので、3 つの異なるインデックスを作成するのが最善でしょうか? それとも 3 つの異なる複数のインデックスですか?

インデックス マージ:

Idx1: Create index A_idx ON table (A)
Idx2: Create index B_idx ON table (B)
Idx3: Create index C_idx ON table (C)

複数のインデックス

Idx1: Create index A_idx ON table(A)
Idx2: Create index AB_idx ON table(A,B)
Idx3: Create index ABC_idx ON table(A,B,C)

これは単純化されたケースです。10 ~ 15 個の列があり、さまざまな方法や組み合わせで結合または配置されるとします。受信するこれらの組み合わせに対して複数の列インデックスを作成するのが最善ですか? または、最も頻繁に使用される複数列の最小セットを見つけて、それらに複数列インデックスを作成し、残りに対して個別のインデックスを作成するだけですか?

4

1 に答える 1

3

(A、B、C) の複合インデックスは 3 つのクエリをカバーするため、(A) と ON (A、B) のインデックスは必要ありません。また、index_merge よりも高速です。

複数のインデックスを持つ唯一の理由は、一部のクエリがインデックスでカバーされない場合です (たとえば、B と C は含まれますが、A は含まれません)。

また、列をインデックスに含めるかどうかを決定する最も重要な特性の 1 つは、列がクエリで使用されるかどうかではなく、カーディナリティであることにも注意してください。この列に対するクエリで多くの行が除外されない場合は、インデックスに含めないでください。

A、B、C があるとしましょう A の特定の値に対して、行の 20% があります。これらの行から、B の特定の値に対して、行の 1% があります。これらの条件 (A、B) がテーブルから 1000 行をフィルター処理するとします。C を適用すると、850 行が表示されます。C のインデックスは効果的ではなく、(A,B) はこのクエリに最適なインデックスです

于 2013-02-21T07:44:15.330 に答える