Chr*_*ian 3 sql postgresql indexing ip-address cidr
在Postgres数据库中,我需要在表A中过滤一组数十万行,只包括那些行中的IP地址列(类型为inet)与几千个IP地址块中的任何一个匹配的行(类型) cidr)在另一个表B中.我在第一个表中的inet地址上尝试了各种索引,在第二个表中尝试了cidr范围,但无论我做什么,规划器都进行嵌套顺序扫描,将<<运算符应用于每对IP地址和前缀.
有没有办法通过索引或其他聪明的技巧加快速度?(我可以使用外部程序脚本,但我想知道它是否在Postgres中可行.)
谢谢!
这是一个老问题,但在谷歌搜索结果中很突出,所以在这里发布我的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)
案件结案。为了让事情变得更快,请执行以下操作:
使用http://pgfoundry.org/projects/ip4r中提供的 ip4r 类型,如用户 bma 所指出的。此类型支持索引,而 Postgres(直至 Postgres 9.3)本机索引则不支持。
不要直接使用 ip4r 类型,而是按照用户 caskey 的建议和 ip4r 文档中提到的将其扩展为下限值和上限值: https: //github.com/petere/ip4r-cvs/blob/master/README.ip4r# L187
鉴于上述情况,如果您对所有比较地址使用 ip4 类型(假设您正在处理 v4 地址),那么规划器将利用这些列上的索引。
谢谢你们的帮助,伙计们!
| 归档时间: |
|
| 查看次数: |
2084 次 |
| 最近记录: |