ars*_*nal 6 java mysql database performance geolocation
我正在开展一个我们需要做的项目IP Address lookups.所以为此我们得到了如下所示的数据集,现在接下来的步骤是将这些数据集(可能是一个csv文件)填入MySql table.以下是包含列的数据集示例 -
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
Run Code Online (Sandbox Code Playgroud)
问题陈述:-
我打算来存储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
Run Code Online (Sandbox Code Playgroud)
鉴于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
Run Code Online (Sandbox Code Playgroud)
更新: -
假设我在文本文件中有几个Thousands IP Address像100,000 IP Addresses我上面提到的格式.
现在我的主要目标是做到IP Address lookup.对应于此,IP Address获取所有其他必填字段.
所以为了使这个东西工作,我最初计划转储文本文件数据MySql table.所以MySql表将包含IP Address列和其他列,就像我在上面的例子中一样.但是对字符串进行查找是很昂贵的.
所以我认为我应该转换那些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
Run Code Online (Sandbox Code Playgroud)
现在,如果我需要进行查找,我可以将其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
Run Code Online (Sandbox Code Playgroud)
所以问题是 -给定一个Text file将具有IP Addresses对应的列表和其他字段,IP Address我应该如何按这样的方式按摩它,以便我可以以我上面提到的格式(例如start_ip_num和end_ip_num,country和其他字段)将相同的数据集存储在MySql中.
基本上我试图遵循Maxmind目前的数据库模式.他们也有start_ip_num和end_ip_num等领域.当你需要进行查找时,你可以通过将IP地址转换为BIGINT使用来对上面提到的SQL进行查找INET_ATON.
IPv4 地址包含 4 个数字,每个数字的范围为 0...255
您可以使用此逻辑将地址 ABCD 转换为 32 位整数(或 bigint 如果您愿意)
Result = (A<<24) | (B<<16) | (C<<8) | D
Run Code Online (Sandbox Code Playgroud)
其中A、B、C、D 是整数。这是我们使用的方法,我认为这甚至最初是针对 MaxMind 进行测试的。(抱歉,如果不完全是java示例)