Wyodrębnianie moich komentarzy do odpowiedzi:wyszukiwanie indeksu tutaj było bardzo szybkie -- cały czas poświęcono na pobieranie rzeczywistych wierszy. 23 sekundy / 7871 wierszy =2,9 milisekundy na wiersz, co jest uzasadnione w przypadku pobierania danych rozproszonych w podsystemie dysku. Poszukiwania są powolne; możesz a) dopasować swój zestaw danych do pamięci RAM, b) kupić dyski SSD lub c) uporządkować dane z wyprzedzeniem, aby zminimalizować poszukiwania.
PostgreSQL 9.2 ma funkcję zwaną skanowaniem tylko indeksu, która pozwala (zazwyczaj) odpowiadać na zapytania bez dostępu do tabeli. Możesz połączyć to z btree
Właściwość index polegająca na automatycznym utrzymywaniu porządku w celu przyspieszenia tego zapytania. Wspominasz int1
, int2
i dwie pływaki:
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
Zauważ również, że to nie wymazuje w magiczny sposób poszukiwań dysku, po prostu przenosi je z czasu zapytania do czasu wstawiania. Kosztuje również miejsce na dysku, ponieważ duplikujesz dane. Mimo to jest to prawdopodobnie kompromis, którego chcesz.