Sind diese gleichwertig? Wenn nicht, warum dann?
Index (Benutzer_ID1, Benutzer_ID2) und Index (Benutzer_ID2, Benutzer_ID1)
Diese sind nicht gleichwertig und im Allgemeinen ist der Index (Balken, Baz) für Abfragen des Formulars nicht effizient select * from foo where baz=?
Erwin hat gezeigt, dass solche Indizes zwar eine Abfrage beschleunigen können, aber dieser Effekt ist begrenzt und nicht in der gleichen Größenordnung, wie Sie allgemein erwarten, dass ein Index eine Suche verbessert. Er beruht auf der Tatsache, dass ein Index häufig vollständig durchsucht wird Schneller als ein vollständiger Scan der indizierten Tabelle aufgrund der zusätzlichen Spalten in der Tabelle, die nicht im Index enthalten sind.
Zusammenfassung: Indizes können bei Abfragen auch für nicht führende Spalten hilfreich sein, jedoch auf eine von zwei sekundären und relativ geringfügigen Arten und nicht auf die dramatische Weise, die ein Index normalerweise aufgrund seiner Btree-Struktur bietet
nb die zwei Möglichkeiten, die der Index bietet, sind, wenn ein vollständiger Index-Scan erheblich günstiger ist als ein vollständiger Tabellenscan und entweder: 1. die Tabellensuche ist günstig (weil es nur wenige gibt oder sie in Clustern vorliegen), oder 2. Der Index deckt, also gibt es überhaupt keine Tabellensuche , siehe Erwins Kommentare hier
Prüfstand:
create table foo(bar integer not null, baz integer not null, qux text not null);
insert into foo(bar, baz, qux)
select random()*100, random()*100, 'some random text '||g from generate_series(1,10000) g;
Abfrage 1 (kein Index, Treffer 74 Puffer ):
explain (buffers, analyze, verbose) select max(qux) from foo where baz=0;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------
Aggregate (cost=181.41..181.42 rows=1 width=32) (actual time=3.301..3.302 rows=1 loops=1)
Output: max(qux)
Buffers: shared hit=74
-> Seq Scan on stack.foo (cost=0.00..181.30 rows=43 width=32) (actual time=0.043..3.228 rows=52 loops=1)
Output: bar, baz, qux
Filter: (foo.baz = 0)
Buffers: shared hit=74
Total runtime: 3.335 ms
Abfrage 2 (mit Index - der Optimierer ignoriert den Index - Treffer) 74 Puffer ):
create index bar_baz on foo(bar, baz);
explain (buffers, analyze, verbose) select max(qux) from foo where baz=0;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------
Aggregate (cost=199.12..199.13 rows=1 width=32) (actual time=3.277..3.277 rows=1 loops=1)
Output: max(qux)
Buffers: shared hit=74
-> Seq Scan on stack.foo (cost=0.00..199.00 rows=50 width=32) (actual time=0.043..3.210 rows=52 loops=1)
Output: bar, baz, qux
Filter: (foo.baz = 0)
Buffers: shared hit=74
Total runtime: 3.311 ms
Abfrage 2 (mit Index - und wir täuschen den Optimierer vor, ihn zu verwenden):
explain (buffers, analyze, verbose) select max(qux) from foo where bar>-1000 and baz=0;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------
Aggregate (cost=115.56..115.57 rows=1 width=32) (actual time=1.495..1.495 rows=1 loops=1)
Output: max(qux)
Buffers: shared hit=36 read=30
-> Bitmap Heap Scan on stack.foo (cost=73.59..115.52 rows=17 width=32) (actual time=1.370..1.428 rows=52 loops=1)
Output: bar, baz, qux
Recheck Cond: ((foo.bar > (-1000)) AND (foo.baz = 0))
Buffers: shared hit=36 read=30
-> Bitmap Index Scan on bar_baz (cost=0.00..73.58 rows=17 width=0) (actual time=1.356..1.356 rows=52 loops=1)
Index Cond: ((foo.bar > (-1000)) AND (foo.baz = 0))
Buffers: shared read=30
Total runtime: 1.535 ms
Der Zugriff über den Index ist in diesem Fall also doppelt so schnell wie bei 30 Puffern - was in Bezug auf die Indizierung "etwas schneller" ist! der Daten in der Tabelle
Im Gegensatz dazu verwenden Abfragen in der führenden Spalte die Btree-Struktur des Index - in diesem Fall 2 Puffer :
explain (buffers, analyze, verbose) select max(qux) from foo where bar=0;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------
Aggregate (cost=75.70..75.71 rows=1 width=32) (actual time=0.172..0.173 rows=1 loops=1)
Output: max(qux)
Buffers: shared hit=38
-> Bitmap Heap Scan on stack.foo (cost=4.64..75.57 rows=50 width=32) (actual time=0.036..0.097 rows=59 loops=1)
Output: bar, baz, qux
Recheck Cond: (foo.bar = 0)
Buffers: shared hit=38
-> Bitmap Index Scan on bar_baz (cost=0.00..4.63 rows=50 width=0) (actual time=0.024..0.024 rows=59 loops=1)
Index Cond: (foo.bar = 0)
Buffers: shared hit=2
Total runtime: 0.209 ms