Sql 针对大型数据集,加快检查CIDR范围内的IP地址成员身份

Sql 针对大型数据集,加快检查CIDR范围内的IP地址成员身份,sql,postgresql,indexing,ip-address,cidr,Sql,Postgresql,Indexing,Ip Address,Cidr,在Postgres DB中,我需要过滤表a中的一组数十万行,只包括行中的IP地址列(inet类型)与数千个IP地址块(cidr类型)中的任何一个匹配的行在另一个表B中,我在第一个表中尝试了inet地址的各种索引,在第二个表中尝试了cidr范围,但无论我做什么,规划器都会应用你看过ip4r吗。IIRC,与INET相关的查找速度非常快。案例结束。要加快速度,请执行以下操作: 如用户bma所指出的,使用从中提供的ip4r类型。这种类型支持Postgres(直到postgres9.3)本机不支持的索引

在Postgres DB中,我需要过滤表a中的一组数十万行,只包括行中的IP地址列(inet类型)与数千个IP地址块(cidr类型)中的任何一个匹配的行在另一个表B中,我在第一个表中尝试了inet地址的各种索引,在第二个表中尝试了cidr范围,但无论我做什么,规划器都会应用你看过ip4r吗。IIRC,与INET相关的查找速度非常快。

案例结束。要加快速度,请执行以下操作:

  • 如用户bma所指出的,使用从中提供的ip4r类型。这种类型支持Postgres(直到postgres9.3)本机不支持的索引

  • 不要直接使用ip4r类型,而是按照用户caskey的建议和ip4r文档中提到的,将其扩展为上下两个值:

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


谢谢你们的帮助,伙计们

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

在Postgres 9.4及更高版本中,您可以对inet和cidr使用GIST索引:

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


我很想听到一个解决办法。一些搜索发现了邮件列表,这反过来又让我找到了。阅读起来可能很方便。在范围搜索中查找成员优化,并将cidr表转换为具有两列的第一个地址/最后一个地址表示形式。感谢caskey,看起来您的建议,再加上bma建议的ip4r的使用,就可以做到这一点。我很快会给出一个完整的答案。我知道,是的。您能否澄清一下,它是否仍然会使用嵌套顺序扫描,在这种扫描中,每个单独的比较都会更快,还是使用更基本的方法?他们确实在他们的网站上提到了一些关于可索引性的内容,但我不知道这是否对我的上下文有帮助。注意:当前的Postgres版本确实支持内置inet操作的索引访问(在发布答案时不支持这种访问)。
create index on geolite2_city_ipv4_block using gist (network inet_ops);

select * from geolite2_city_ipv4_block where network >>= '8.8.8.8';