我正在开发一个项目,我们需要做这项工作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_NUM
和END_IP_NUM
为BIGINT
存储在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_num
和end_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_num
和end_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_num
和end_ip_num
,和其他字段)在MySql中存储相同的数据集。
基本上我试图按照目前Maxmind等数据库的模式。他们也有start_ip_num
和end_ip_num
等字段。而当你需要做查找时,你可以通过使用INET_ATON
将IP地址转换为BIGINT
来在上面提到的SQL上进行查找。
为什么不把它作为一个整数存储? IPv4地址保证不超过8个字节。 – Makoto 2013-03-12 05:03:56
@Makoto我会说IPv4地址保证是4个字节。 – PSIAlt 2013-03-12 05:07:34
我提出了IPv4和4字节的建议,但是......也许在新的应用程序中支持IPv6有好处吗? – Kamil 2013-03-12 05:19:45