Extrahera mina kommentarer till ett svar:indexsökningen här var mycket snabb -- all tid gick åt till att hämta de faktiska raderna. 23 sekunder / 7871 rader =2,9 millisekunder per rad, vilket är rimligt för att hämta data som är utspridda över diskundersystemet. Sökandet är långsamt; du kan a) passa din datauppsättning i RAM, b) köpa SSD:er eller c) organisera din data i förväg för att minimera sökningar.
PostgreSQL 9.2 har en funktion som kallas index-only scans som gör att den (vanligtvis) kan svara på frågor utan att komma åt tabellen. Du kan kombinera detta med btree
indexegenskap för att automatiskt upprätthålla ordning för att göra denna fråga snabb. Du nämner int1
, int2
, och två flottörer:
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
Observera också att detta inte på magiskt sätt raderar disksökningarna, det flyttar dem bara från frågetid till insättningstid. Det kostar dig också lagringsutrymme, eftersom du duplicerar data. Ändå är detta förmodligen den avvägning du vill ha.