3

結合で参照される列にインデックスを作成する必要はありますか? など。ON句の列にインデックスが必要ですか?

SELECT 
    * 
FROM 
    left_table 
INNER JOIN 
    right_table 
ON 
    left_table.foo = right_table.bar 
WHERE 
    ... 

私はleft_table(foo)、right_table(bar)、またはその両方でインデックスを作成する必要がありますか?

私はインデックスがWHERE句の左側に使用されていることを確実に知る指標とし、なし(Postgresqlの)EXPLAINと比較

(right_table.bar = left_table.foo) 

のための周りに切り替える使用したとき、私は異なる結果に気づいたが、私はON句に列挙されている列に索引が必要かどうか疑問に思っています。

答えて

2

お客様のwhere条件によって異なりますが、簡単な回答はyesです。

通常、左側の表には、この列がデフォルトで索引となる主キーとして格納されます。 2番目の列は外部キーになります。この列に追加されたインデックスからクエリが恩恵を受ける可能性があります。インデックスが必要かどうかを確認するために、クエリを分析する必要があります。

レッツは、クエリは次のようであると言う:right_table.bar

SELECT * 
FROM left_table 
    INNER JOIN right_table ON 
     left_table.foo = right_table.bar 
WHERE left_table.SomeField = 1 

指数は間違いなく使用されます。他方の側で

right_table.barに、この場合の指数で

SELECT * 
FROM left_table 
    INNER JOIN right_table ON 
     left_table.foo = right_table.bar 
WHERE right_table.SomeField = 1 

left_table.foo意志上のすべてに使用されるが、インデックスされません。

+0

マージ結合アルゴリズムは、通常、ON条件の両側のインデックスで高速に実行されます。大規模なカーディナリティー結合の場合、これが最速の戦略である可能性があります。 2番目の索引がなければ、オプティマイザはマージ結合戦略を選択することさえできません。 –

2

通常、左側にはプライマリキーがあるので、インデックスは必要ありません。しかし、通常、外部キーを持っています。インデックスには意味があります。

+0

ありがとうございます。私はあなたの答えを受け入れることができないと感じていますが、上記の回答者はもっと多くを書いています。私は彼の努力のために彼に報いた: – newbie

+1

@newbie、あなたは多くの答えをupvoteすることができます=) –

+0

@ジョシュスミトン、ああ。それを知らなかった。ありがとう。 – newbie

関連する問題