Estrarre i miei commenti in una risposta:la ricerca dell'indice qui è stata molto veloce:è stato speso tutto il tempo a recuperare le righe effettive. 23 secondi / 7871 righe =2,9 millisecondi per riga, valore ragionevole per il recupero di dati sparsi nel sottosistema del disco. Le ricerche sono lente; puoi a) inserire il tuo set di dati nella RAM, b) acquistare SSD o c) organizzare i tuoi dati in anticipo per ridurre al minimo le ricerche.
PostgreSQL 9.2 ha una funzione chiamata scansioni solo indice che gli consente (di solito) di rispondere alle query senza accedere alla tabella. Puoi combinarlo con il btree
index di mantenere automaticamente l'ordine per rendere veloce questa query. Menzioni int1
, int2
e due float:
CREATE INDEX sometable_int1_floats_key ON sometable (int1, float1, float2);
CREATE INDEX sometable_int2_floats_key ON sometable (int2, float1, float2);
SELECT float1,float2 FROM sometable WHERE int1=<value>; -- uses int1 index
SELECT float1,float2 FROM sometable WHERE int2=<value>; -- uses int2 index
Nota anche che questo non cancella magicamente le ricerche del disco, ma le sposta semplicemente dall'ora della query all'ora di inserimento. Ti costa anche spazio di archiviazione, poiché stai duplicando i dati. Tuttavia, questo è probabilmente il compromesso che desideri.