Postgresは、Bツリーインデックスで先頭以外の列を使用できますが、効率がはるかに低くなります。
最初の列が非常に選択的である場合(A
ごとに数行のみ) )どちらのアクセス方法(縮小されたセットでの順次スキャンでも)が安価であるため、パフォーマンスの違いにほとんど気付かないでしょう。パフォーマンスへの影響は、A
あたりの行数とともに増加します 。
あなたが説明するケースでは、 (A, C, B)
にインデックスを作成することをお勧めします または(C, A, B)
(B
最後に来る)パフォーマンスを最適化する。このようにして、(A, B, C)
でのクエリで最高のパフォーマンスを得ることができます。 および(A, C)
同様に。
インデックス内の列のシーケンスとは異なり、クエリ内の述語のシーケンスは重要ではありません。
これについては、dba.SEで詳細に説明しました:
ではないことに注意してください A, C
でリードするかどうかは関係ありません またはC, A
手元のケースの場合:
他にもいくつかの考慮事項がありますが、質問に関連するすべての詳細が含まれているわけではありません。