Опитайте с многоколонен индекс, но с обратен ред на втората колона:
CREATE INDEX index_ips_begin_end_ip_num ON ips (begin_ip_num, end_ip_num DESC);
Подреждането е най-вече без значение за индекс с една колона, тъй като може да се сканира назад почти толкова бързо. Но това е важно за многоколонни индекси.
С индекса, който предлагам, Postgres може да сканира първата колона и да намери адреса, където останалата част от индекса изпълнява първото условие. Тогава той може, за всяка стойност на първата колона, да върне всички редове, които отговарят на второто условие, докато първото се провали. След това преминете към следващата стойност на първата колона и т.н.
Това все още не е много ефективно и Postgres може да е по-бърз само като сканира първата индексна колона и филтрира за втората. Много зависи от разпределението на вашите данни.
Така или иначе, CLUSTER
с помощта на многоколонния индекс отгоре може помощно представяне:
CLUSTER ips USING index_ips_begin_end_ip_num
По този начин кандидатите, отговарящи на първото ви условие, се опаковат на същите или съседни страници с данни. Може да помогне много на производителността, ако имате много редове на стойност на първата колона. Иначе едва ли е ефективен.
(Има и неблокиращи външни инструменти за целта:pg_repack или pg_squeeze.)
Освен това автоматичното вакуумиране работи и е конфигурирано правилно или сте изпълнили ANALYZE
на масата? Имате нужда от текуща статистика за Postgres, за да изберете подходящи планове за заявки.
Това, което наистина би помогнало тук, е индекс GiST за int8range
колона, достъпна след PostgreSQL 9.2.
Допълнително четене:
- Оптимизиране на заявки за диапазон от времеви марки (две колони)
Ако вашите IP диапазони могат да бъдат покрити с един от вградените типове мрежи inet
или cidr
, помислете за замяна на вашите два bigint
колони. Или още по-добре, погледнете допълнителния модул ip4r от Andrew Gierth (не е в стандартната дистрибуция. Стратегията за индексиране се променя съответно.
Освен това, можете да проверите този свързан отговор на dba.SE с помощта на сложен режим с частични индекси. Разширени неща, но осигурява страхотна производителност:
- Може ли пространственият индекс да помогне на заявка „обхват – подреждане по – граница“