微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

postgres 在 2 db 列之间查找 IP 地址

如何解决postgres 在 2 db 列之间查找 IP 地址

我有一个 IP 地址表。该表有两列名称 starting_ipending_ip。该表如下所示:

enter image description here

现在,假设我有一个随机 IP 地址。从那个随机的 IP 地址,我想知道 city_name。这意味着我需要根据 starting_ipending_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 举报,一经查实,本站将立刻删除。