Индекс PostgreSQL не используется для запроса по диапазону
м с использованием PostgreSQL (9.2.0) и иметь таблицу диапазонов IP-адресов. Вот's SQL: я
CREATE TABLE ips
(
id serial NOT NULL,
begin_ip_num bigint,
end_ip_num bigint,
country_name character varying(255),
CONSTRAINT ips_pkey PRIMARY KEY (id )
)
мы добавили индексы на обоихbegin_ip_num
а также :end_ip_num
CREATE INDEX index_ips_on_begin_ip_num
ON ips
USING btree
(begin_ip_num );
CREATE INDEX index_ips_on_end_ip_num
ON ips
USING btree
(end_ip_num );
Используемый запрос:
SELECT "ips".* FROM "ips" WHERE (3065106743 BETWEEN begin_ip_num AND end_ip_num);
Проблема в том, что мойBETWEEN
запрос только с использованием индекса наbegin_ip_num
, После использования индекса он фильтрует результат, используяend_ip_num
, Вот'сEXPLAIN ANALYZE
Результат: я
Index Scan using index_ips_on_begin_ip_num on ips (cost=0.00..2173.83 rows=27136 width=76) (actual time=16.349..16.350 rows=1 loops=1)
Index Cond: (3065106743::bigint >= begin_ip_num)
Filter: (3065106743::bigint