Postgresql 使用Postgres的IPv4最长前缀匹配
给定一个IP地址192.168.0.1,以及一个带有列next_hop_subnet存储子网IP地址的表,您是否发现以下PostGRESQL逻辑、准确性或性能方面存在任何问题: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
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是否更快。不过值得一试。在正确的列上建立索引可能最有帮助。