2013-03-12 60 views
6

我正在开发一个项目,我们需要做这项工作IP Address lookups。所以为此我们得到了下面的数据集,现在接下来的步骤是填充这个数据集(可能是一个csv文件)到MySql table。下面是含有columns-将IP地址范围转换为两个BIGINT以便更快速地查找

ip_address  country region city   metro-code latitude longitude postal-code country-code region-code city-code continent-code country-code 

24.32.116.116 usa  tx clarksville 623   33.6103 -95.0498 75426   840   44    34918   6   us 
65.29.108.232 usa  mi novi   505   42.4637 -83.4604 48375   840   23    4339    6   us 
66.169.99.69 usa  tx ft worth  623   32.7016 -97.3823 76109   840   44    771    6   us 
72.70.100.111 usa  ma peabody  506   42.5332 -70.9726 1960    840   22    1392    6   us 
174.252.116.137 usa  va oakton   511   38.8892 -77.3222 22124   840   47    3860    6   us 
68.55.144.242 usa  md pasadena  512   39.1276 -76.5125 21122   840   21    4358    6   us 
174.252.83.27 usa  pa lancaster  566   40.0459 -76.3542 17603   840   39    333    6   us 
174.78.192.31 usa  ga warner robins 503   32.5958 -83.6384 31088   840   11    5052    6   us 
98.192.146.235 usa  fl panama city 656   30.1804 -85.5598 32404   840   10    671    6   us 
71.192.181.20 usa  ma springfield 543   42.1187 -72.5483 1109    840   22    967    6   us 
76.183.54.227 usa  tx dallas   623   32.7202 -96.6769 75217   840   44    77    6   us 
69.62.143.140 usa  ca granite bay 862   38.7442 -121.191 95746   840   5    49451   6   us 
69.142.76.32 usa  nj penns grove 504   39.707  -75.4467 8069    840   31    2335    6   us 
70.173.54.93 usa  nv las vegas  839   36.2059 -115.225 89108   840   29    173    6   us 
98.242.8.222 usa  ca fresno   866   36.7968 -119.883 93722   840   5    19    6   us 

问题陈述的数据集例如: -

我打算到START_IP_NUMEND_IP_NUMBIGINT存储在MySQL数据库中,而不是存储在表IP Address为做对比BIGINT的查找速度要快于搜索字符串(虚线IP符号)。就像我们为Maxmind建立数据库一样。

所以我的问题是我们将分开的Java Program将填充MySql表中的上述数据集。所以,我需要设备某种逻辑的可在上述数据集转换成类似如下─

start_ip_num 
end_ip_num 
country 
region 
city   
metro-code 
latitude  
longitude 
postal-code 
country-code  
region-code 
city-code 
continent-code 
country-code 

我迷惑给予了IP地址我应该如何装置start_ip_numend_ip_num这里并将其存储到MySql table。由于将会有一个文件,我假设将包含上述数据集,然后我需要读取该文件和设备的某种逻辑,将IP地址转换为两个BIGINT并将其存储到MySql表中。

并将其存储到MySql数据库后。我可以做查找这样的事情在MySql-

SELECT country 
FROM geoip 
WHERE 
INET_ATON('174.36.207.186') BETWEEN start_ip_num AND end_ip_num 
LIMIT 1 

更新: -

假设我有大约几个Thousands IP Address就像在我上面提到的格式的文本文件100,000 IP Addresses

现在我的主要目标是做IP Address lookup。对应于此IP Address让我所有其他必填字段。

所以为了使这个工作,我最初打算转储文本文件数据,因为它在MySql table。因此,MySql表将包含IP Address列和其他列,就像我在上面的示例中所示。但是在String上查找代价很高。

所以我想我应该转换的IP地址start_ip_numend_ip_num范围,然后转储MySql table数据,因此现在它看起来像这 -

start_ip_num 
end_ip_num 
country 
region 
city   
metro-code 
latitude  
longitude 
postal-code 
country-code  
region-code 
city-code 
continent-code 
country-code 

现在,如果我需要做的查找,我能有这样SQL query嵌在我WebService eventually -

SELECT country 
FROM geoip 
WHERE 
INET_ATON('174.36.207.186') BETWEEN start_ip_num AND end_ip_num 
LIMIT 1 

因此质疑是 -给定一个Text file其无线将有IP Addresses和对应的其他字段的列表IP Address我应该如何按摩它,以便我可以以我上面提到的格式(如start_ip_numend_ip_num,和其他字段)在MySql中存储相同的数据集。

基本上我试图按照目前Maxmind等数据库的模式。他们也有start_ip_numend_ip_num等字段。而当你需要做查找时,你可以通过使用INET_ATON将IP地址转换为BIGINT来在上面提到的SQL上进行查找。

+4

为什么不把它作为一个整数存储? IPv4地址保证不超过8个字节。 – Makoto 2013-03-12 05:03:56

+6

@Makoto我会说IPv4地址保证是4个字节。 – PSIAlt 2013-03-12 05:07:34

+0

我提出了IPv4和4字节的建议,但是......也许在新的应用程序中支持IPv6有好处吗? – Kamil 2013-03-12 05:19:45

回答

1

IPv4地址包含4个数字,其各自的范围可以从0〜255。

可以地址ABCD转换为一个32位的整数(或BIGINT如果您愿意)与此逻辑

Result = (A<<24) | (B<<16) | (C<<8) | D 

其中A,B,C,D是整数。这是我们使用的方法,我认为这甚至最初是针对MaxMind进行测试的。 (道歉,如果不完全是java例子)

+0

谢谢,但如何获得start_ip_num和end_ip_num。从上面的例子中,我只能得到单一的IP地址BIGINT?但如何有start_ip_num和end_ip_num的范围?这让我很困惑。 – ferhan 2013-03-12 15:14:44

0

你似乎在IpAddress和它在世界的物理位置之间有某种硬关系。例如,如果两个密切相关的IpAdresses来自纽约,那么在这两个IpAdresse之间的值的任何IpAdresse也应该来自纽约;对?

错!

IP地址在世界范围内的分布是完全随意的,而IP地址通常分布在国家,地区,大公司等区域。之后会发生什么或多或少是任意的。例如,像微软和谷歌这样的大公司拥有自己的IP地址块;然而,他们对它的处理完全是任意的,微软选择使用一个IP地址的做法可能与下一个或以前的地址完全不同。甚至有可能一个IP地址在第二天将指向一个国家和另一个国家,因为网络拓扑结构已经发生变化。

在IP地址与其物理位置之间建立关系需要一个非常广泛的数据库,即使在这种情况下,也很容易出现错误和日常更改。即使Google使用的数据库可能充满了错误,它的广泛数据。

0

你有IP地址的原始数据,你希望它代表范围格式。这是它应该如何工作的流程图。

1)转换所有IP地址,IP号码 2)排序的IP数量上升 3)通过记录扫描和压缩与同城记录

例如,IP 1和IP 2是在X城你可以把它表示为1,2,X。

这里的假设是你有几乎所有的IP地址。如果两个数字之间缺少差距,则需要假定它来自同一个城市X.例如,IP 1和IP 3位于城市X中,您也假设IP位于X中。 1,3,X。