Wypróbuj indeks wielokolumnowy, ale z odwróconą kolejnością w drugiej kolumnie:
CREATE INDEX index_ips_begin_end_ip_num ON ips (begin_ip_num, end_ip_num DESC);
Porządkowanie jest w większości przypadków nieistotne dla indeksu jednokolumnowego, ponieważ można go skanować wstecz prawie tak samo szybko. Ale jest to ważne w przypadku indeksów wielokolumnowych.
Za pomocą proponowanego przeze mnie indeksu Postgres może zeskanować pierwszą kolumnę i znaleźć adres, pod którym reszta indeksu spełnia pierwszy warunek. Następnie może, dla każdej wartości z pierwszej kolumny, zwrócić wszystkie wiersze spełniające drugi warunek, dopóki pierwszy nie zawiedzie. Następnie przejdź do następnej wartości w pierwszej kolumnie itd.
To jest nadal niezbyt wydajne Postgres może być szybszy, po prostu skanując pierwszą kolumnę indeksu i filtrując drugą. Bardzo wiele zależy od dystrybucji danych.
Tak czy inaczej, CLUSTER
używając wielokolumnowego indeksu z góry może pomoc wydajność:
CLUSTER ips USING index_ips_begin_end_ip_num
W ten sposób kandydaci spełniający Twój pierwszy warunek są umieszczani na tych samych lub sąsiadujących stronach danych. Może znacznie zwiększyć wydajność, jeśli masz wiele wierszy na wartość w pierwszej kolumnie. W przeciwnym razie jest to mało skuteczne.
(Istnieją również nieblokujące narzędzia zewnętrzne do tego celu:pg_repack lub pg_squeeze.)
Ponadto, czy autovacuum działa i jest poprawnie skonfigurowane, czy też uruchomiono ANALYZE
? na stole? Potrzebujesz aktualnych statystyk, aby Postgres mógł wybrać odpowiednie plany zapytań.
To, co naprawdę by tu pomocne, to indeks GiST dla int8range
kolumna, dostępna od PostgreSQL 9.2.
Dalsza lektura:
- Optymalizacja zapytań w zakresie sygnatur czasowych (dwie kolumny)
Jeśli Twoje zakresy adresów IP mogą być pokryte jednym z wbudowanych typów sieci inet
lub cidr
, rozważ zastąpienie dwóch bigint
kolumny. Albo jeszcze lepiej spójrz na dodatkowy moduł ip4r autorstwa Andrew Giertha (nie w standardowej dystrybucji. Strategia indeksowania zmienia się odpowiednio.
Poza tym możesz sprawdzić powiązaną odpowiedź na dba.SE, korzystając z wyrafinowanego systemu z częściowymi indeksami. Zaawansowane rzeczy, ale zapewniają doskonałą wydajność:
- Czy indeks przestrzenny może pomóc w zapytaniu typu „zakres – sortuj według – limit”