pg有专门的IP数据类型 inet,可直接对字段操作,>=,<=IP地址搜索
为了提高搜索速度,需要建索引
- Btree索引(最快)
btree (ip_start, ip_end)+加上order by ip_start desc limit 1;前提条件:表里IP范围不能重叠,一个IP只能查一条记录;所有IP都能查到,不然会扫描一半的索引;
因为表里ip范围是不重叠的。基本上ip_start小于等于目标ip的最大的记录就是了,这时候用btree索引有序的特性只要取一条记录。
同样的SQL有多种不同的执行方式,优化器选它认为最佳的执行计划。有order by limit的SQL更偏向于: 从索引里按顺序取记录再评估记录是否满足条件
CREATE INDEX "a" ON "public"."ip_idc" USING btree (
"ip_start",
"ip_end"
);
select * from ip_idc where ip_start <='113.201.214.203'::inet and ip_end >='113.201.214.203'::inet order by ip_start desc limit 1;
- gist索引查询inetrange,建议PG10版本以上,性能最好
create table idc(ip_start inet,i