Postgresql 使用Postgres的IPv4最长前缀匹配

Postgresql 使用Postgres的IPv4最长前缀匹配,postgresql,ipv4,longest-prefix,Postgresql,Ipv4,Longest Prefix,给定一个IP地址192.168.0.1,以及一个带有列next_hop_subnet存储子网IP地址的表,您是否发现以下PostGRESQL逻辑、准确性或性能方面存在任何问题: minDif := select min(abs(inet '192.168.0.1' - next_hop_subnet::inet)) from routing_table where next_hop_subnet::inet >>= inet '192.168

给定一个IP地址192.168.0.1,以及一个带有列next_hop_subnet存储子网IP地址的表,您是否发现以下PostGRESQL逻辑、准确性或性能方面存在任何问题:

minDif := select min(abs(inet '192.168.0.1' -  next_hop_subnet::inet)) 
         from routing_table 
         where next_hop_subnet::inet >>= inet '192.168.0.1';

select * 
from routing_table 
where next_hop_subnet::inet >>= inet '192.168.0.1' 
      AND abs(inet '192.168.0.1' -  next_hop_subnet::inet) = minDif;

由于可以有多个同样好的匹配,我认为只有分两步才能做到这一点。有什么建议吗?

我会使用
masklen(inet)
函数来排序答案,比如:

SELECT * FROM routing_table
 WHERE next_hop_subnet::inet >>= inet '192.168.0.1'
 AND masklen(next_hop_subnet::inet) = (
     SELECT masklen(next_hop_subnet::inet) FROM routing_table
     WHERE next_hop_subnet::inet >>= inet '192.168.0.1')
     ORDER BY masklen(next_hop_subnet::inet) DESC
     LIMIT 1
 );

这样,您就可以从路由表中获得最长的匹配前缀。

谢谢,编辑后,现在它涵盖了多个等效匹配。唯一的问题可能是最长前缀匹配的顺序应该是降序的,对吗?我做了一个小编辑,删除了一些语法问题。我认为这个解决方案足够接近路由器在传递数据包时所做的查找。您认为我们可以通过获取select max(masklen(next_hop_subnet::inet))来消除order by语句吗。。。。。?我只是想在一个巨大的表(300K)中提高查询时间,我不确定在这种情况下max或orderby是否更快。不过值得一试。在正确的列上建立索引可能最有帮助。