对于大型数据集,加快检查CIDR范围内的IP地址成员资格

Chr*_*ian 3 sql postgresql indexing ip-address cidr

在Postgres数据库中,我需要在表A中过滤一组数十万行,只包括那些行中的IP地址列(类型为inet)与几千个IP地址块中的任何一个匹配的行(类型) cidr)在另一个表B中.我在第一个表中的inet地址上尝试了各种索引,在第二个表中尝试了cidr范围,但无论我做什么,规划器都进行嵌套顺序扫描,将<<运算符应用于每对IP地址和前缀.

有没有办法通过索引或其他聪明的技巧加快速度?(我可以使用外部程序脚本,但我想知道它是否在Postgres中可行.)

谢谢!

Mag*_*iie 5

这是一个老问题,但在谷歌搜索结果中很突出,所以在这里发布我的2美分:

使用Postgres 9.4及更高版本,您可以使用inet和cidr的GIST索引:https://www.postgresql.org/docs/current/static/gist-builtin-opclasses.html

例如,以下查询将使用gist索引(假设来自MaxMind的免费数据集的表):

create index on geolite2_city_ipv4_block using gist (network inet_ops);

select * from geolite2_city_ipv4_block where network >>= '8.8.8.8';
Run Code Online (Sandbox Code Playgroud)


Chr*_*ian 2

案件结案。为了让事情变得更快,请执行以下操作:

鉴于上述情况,如果您对所有比较地址使用 ip4 类型(假设您正在处理 v4 地址),那么规划器将利用这些列上的索引。

谢谢你们的帮助,伙计们!

  • 注意:当前的 Postgres 版本确实支持内置 inet 操作的索引访问(发布答案时不支持)。 (3认同)