将IP地址范围转换为两个BIGINT以便更快地查找

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_NUMEND_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_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
Run Code Online (Sandbox Code Playgroud)

更新: -

假设我在文本文件中有几个Thousands IP Address100,000 IP Addresses我上面提到的格式.

现在我的主要目标是做到IP Address lookup.对应于此,IP Address获取所有其他必填字段.

所以为了使这个东西工作,我最初计划转储文本文件数据MySql table.所以MySql表将包含IP Address列和其他列,就像我在上面的例子中一样.但是对字符串进行查找是很昂贵的.

所以我认为我应该转换那些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
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_numend_ip_num,country和其他字段)将相同的数据集存储在MySql中.

基本上我试图遵循Maxmind目前的数据库模式.他们也有start_ip_numend_ip_num等领域.当你需要进行查找时,你可以通过将IP地址转换为BIGINT使用来对上面提到的SQL进行查找INET_ATON.

rlb*_*rlb 1

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示例)