2

インデックス付きのテーブルがあります:

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" (遅い) です。

4

1 に答える 1

3

@horse で強調表示されているより詳細なクエリ プラン オプションを除けば、答えは「いいえ」です。インデックスがどのように機能するかについての基本的な理解 (もちろん、自分のスキーマを知っていること) 以外に、ヒントや知る方法はありません。

于 2013-11-05T09:54:45.407 に答える