Извличане на коментарите ми в отговор:търсенето на индекс тук беше много бързо - цялото време беше прекарано в извличане на действителните редове. 23 секунди / 7871 реда =2,9 милисекунди на ред, което е разумно за извличане на данни, които са разпръснати в дисковата подсистема. Търсенето е бавно; можете а) да поставите набора си от данни в RAM, б) да закупите SSD дискове или в) да организирате данните си предварително, за да сведете до минимум търсенията.
PostgreSQL 9.2 има функция, наречена сканиране само с индекс, която му позволява (обикновено) да отговаря на заявки без достъп до таблицата. Можете да комбинирате това с btree
свойство индекс за автоматично поддържане на реда, за да направи тази заявка бърза. Споменавате int1
, int2
, и две плувки:
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
Имайте предвид също, че това не изтрива магически търсенията на диска, а просто ги премества от времето на заявка към времето за вмъкване. Това също ви струва място за съхранение, тъй като дублирате данните. Все пак това вероятно е компромисът, който искате.