Extrahování mých komentářů do odpovědi:vyhledávání indexu zde bylo velmi rychlé -- veškerý čas strávil načítání skutečných řádků. 23 sekund / 7871 řádků =2,9 milisekundy na řádek, což je rozumné pro načítání dat, která jsou rozptýlena v diskovém subsystému. Hledání je pomalé; můžete a) uložit svou datovou sadu do paměti RAM, b) koupit SSD nebo c) uspořádat svá data předem, abyste minimalizovali vyhledávání.
PostgreSQL 9.2 má funkci zvanou index-only scans, která mu umožňuje (obvykle) odpovídat na dotazy bez přístupu k tabulce. Můžete to zkombinovat s btree
index vlastnost automatického udržování pořadí, aby byl tento dotaz rychlý. Zmiňujete int1
, int2
, a dva plovoucí:
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
Všimněte si také, že to magicky nevymaže hledání disku, pouze je přesune z času dotazu na čas vložení. Také vás to stojí úložný prostor, protože duplikujete data. Přesto je to pravděpodobně kompromis, který chcete.