我正在使用 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 )
)
我已在begin_ip_num
和end_ip_num
上添加了普通的B树索引:
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
上添加复合指数。