【发布时间】:2012-08-21 20:39:14
【问题描述】:
我获得了 200 万个 IP 地址和 2500 万个 IP 范围,其中起始 IP、结束 IP 和地理位置存储在 PostgreSQL 中。有没有一种有效的方法可以从 2500 万个数据库中查找这 200 万个 IP 的地理位置?我所做的是比较一个IP地址是否在Start IP和End IP之间,并查找相应的位置。然而,这似乎需要永远。大概这更像是从一组范围中查找一堆整数,例如从以下位置搜索 {7, 13, 31, 42}:
Start End Loc
1 10 US
11 20 US
21 26 CN
29 32 SE
33 45 CA
然后返回:
7 US
13 US
31 SE
42 CA
请注意,范围可能不一定相连,大小也可能不同。谢谢!
编辑
作为一个具体的例子,这是我正在处理的数据:
start_ip | end_ip | country | region | city |
------------------+------------------+---------+-----------+-----------+-
1.33.254.73/32 | 1.33.254.73/32 | jpn | 33 | kurashiki |
1.39.1.0/32 | 1.39.4.255/32 | ind | mh | mumbai |
1.40.144.0/32 | 1.40.145.255/32 | aus | ns | fairfield |
1.40.235.0/32 | 1.40.242.255/32 | aus | ns | sydney |
1.44.28.0/32 | 1.44.29.255/32 | aus | vi | melbourne |
1.44.82.0/32 | 1.44.83.255/32 | aus | vi | melbourne |
1.44.92.0/32 | 1.44.93.255/32 | aus | vi | melbourne |
1.44.128.0/32 | 1.44.129.255/32 | aus | vi | melbourne |
1.44.220.0/32 | 1.44.221.255/32 | aus | vi | melbourne |
......
......
查询类似于:
75.149.219.61/32
68.239.61.29/32
96.41.50.165/32
183.62.126.7/32
......
【问题讨论】:
-
IP是用inet格式存储的,还是怎么存储的?
-
如果 start、end 和 ip 实际上存储为整数,我建议将 start 和 end 分解为单独的行,如下所示:asktom.oracle.com/pls/asktom/…,对结果进行排序并对其进行查找
-
包括您当前获取的查询计划以及随之而来的查询。
标签: algorithm postgresql geolocation mapping ip