インデックス付きのテーブルがあります:
create index on foo (a, b, c);
a および b を検索する場合、Postgres はインデックスを使用して行をすばやく検索できます。
test=# explain analyze select a from foo where a = 3 and b = 4;
Index Only Scan using foo_a_b_c_idx on foo (cost=0.43..486.83 rows=120 width=4) (actual time=0.141..23.981 rows=59049 loops=1)
Index Cond: ((a = 3) AND (b = 4))
Heap Fetches: 59049
Total runtime: 25.894 ms
b と c の検索は、インデックス全体 (またはテーブル) を線形にスキャンする必要があるため、はるかに遅くなります。
test=# explain analyze select a from foo where b = 4 and c = 5;
Index Only Scan using foo_a_b_c_idx on foo (cost=0.43..121987.32 rows=120 width=4) (actual time=7.377..159.793 rows=59049 loops=1)
Index Cond: ((b = 4) AND (c = 5))
Heap Fetches: 59049
Total runtime: 160.735 ms
ただし、クエリ プランはどちらの場合も同じように見えます (どちらも「インデックス オンリー スキャン」と呼ばれ、いくつかの「インデックス条件」があります)。アクセスが対数時間または線形時間で可能かどうかを判断することは可能ですか (各インデックス定義を確認する必要はありません)。 )?
他のデータベース システムでは、インデックスの使用方法がより明確になっています。MS SQL では、最初のクエリは「インデックス シーク」(高速) で、2 番目のクエリは「インデックス スキャン」(低速) です。Sqlite では、最初のものは "SEARCH TABLE foo USING COVERING INDEX" (高速) で、2 番目のものは "SCAN TABLE foo USING COVERING INDEX" (遅い) です。