如何解决postgres 在 2 db 列之间查找 IP 地址
我有一个 IP 地址表。该表有两列名称 starting_ip
和 ending_ip
。该表如下所示:
现在,假设我有一个随机 IP 地址。从那个随机的 IP 地址,我想知道 city_name
。这意味着我需要根据 starting_ip
和 ending_ip
知道随机 IP 地址落在哪个范围之间。然后找到 1 条记录并获得 city_name
。
class IpToCity < ActiveRecord::Base
establish_connection :"ip_database_#{Rails.env}"
scope :search_within_ip_range,-> (ip_address) do
self.connection.select_all("
with candidate as (
select * from ip_cities
where ending_ip >= '#{ip_address}'::inet
order by ending_ip asc
limit 1
)
select * from candidate
where starting_ip <= '#{ip_address}'::inet;
")
end
end
这是一个范围,我在其中传递随机 IP 并获得单个记录。问题是,查询工作正常,但速度很慢。任何建议,如何使其更快?
提前致谢!
解决方法
是否所有行都匹配此格式?
starting_ip ending_ip
x.y.z.0 x.y.z.255
如果是这样,那么您可以为“前缀”添加另一列:x.y.z。
然后将目标的前 3 个八位字节与前缀列进行匹配。
更新数据库时,将跨越一个以上前缀的行分成多行。
最大行数为 16.8M (2563),这很小,仅比您当前的 5M 稍大。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。