我正在使用 PostgreSQL 9.2 并且有一个 IP 范围表。这是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 )
)
我在 和 上添加了普通的 B-treebegin_ip_num
索引end_ip_num
:
CREATE INDEX index_ips_on_begin_ip_num ON ips (begin_ip_num);
CREATE INDEX index_ips_on_end_ip_num ON ips (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 <= end_ip_num)
Rows Removed by Filter: 47596
Total runtime: 16.425 ms
我已经尝试过各种索引组合,包括在begin_ip_num
和上添加复合索引end_ip_num
。