Database IP2百万条以上记录的位置查询

Database IP2百万条以上记录的位置查询,database,perl,Database,Perl,我订阅了一个ip2location服务,它提供了一个这种格式的SQL表 FromIP (int), ToIP(int), lat, long, city etc etc 我想解析我的访问日志并对所有用户进行分类 访问日志有IP地址和用户ID 所以我运行了一个查询,如下所示 select city from ip2location where FromIP <= $ipAsInt AND ToIP => $ipAsInt 但这对于我必须解析的数百万条记录来说太长了。我想这一定

我订阅了一个ip2location服务,它提供了一个这种格式的SQL表

FromIP (int), ToIP(int), lat, long, city  etc etc 
我想解析我的访问日志并对所有用户进行分类 访问日志有IP地址和用户ID

所以我运行了一个查询,如下所示

select city from ip2location where FromIP <= $ipAsInt  AND ToIP => $ipAsInt

但这对于我必须解析的数百万条记录来说太长了。我想这一定是ip2location的一个非常常见的用法。是否可以优化结构?

确保您的表在FromIP和ToIP上建立了索引。 检查您的数据库,如果它具有诸如完整的内存中表等功能,则可以进行查找


您可能希望将所有IP加载到另一个表中,并在一条SQL语句中将城市加入到该表中,而不是为每个IP发送一条语句。这比一次只在一个IP上完成要快得多。

如果你能用perl编写代码,你就可以使用备忘录 因此,具有相同IP的后续呼叫将不会在DB中查找

进一步的优化将是使用IP的C类组件进行查询,如果您愿意失去一些准确性的话


从ip到ip以及复合索引的索引也会有所帮助。

我发现最简单的方法是按ip的排序顺序查找 查找IP时,我也会选择最后一个IP

像这样

选择城市,从IP2位置输入IP,其中从IP$ipAsInt输入

现在,当我必须查找下一个地址时,如果下一个ip已经小于最后一个$ToIP,我不会查询该表


对于每1000次查询,我在这里只查询了大约80次

您也可以这样编写查询

select city,ToIP from ip2location where ToIP >= $ipAsInt order by ToIP limit 1
这将比以前快得多

您还可以为ToIP列编制索引,以提高性能

正如所建议的,您可以使用

ALTER TABLE ip2location ADD PRIMARY KEY(FromIP,ToIP);

事实证明,你可以做得比极限1好多了

在上,它显示了如何使用子查询快几个数量级:

从中选择* 从ip2location_db3中选择*,其中ip_to>=INET_ATON'8.8.8'限制1
作为ip_来自的tmp,我多次看到连接查询结束时比单个查询时间的总和长得多。关于何时可以使用组查询而不是单个查询,是否有一个经验法则。如果数据库上的联接比其他组件随后联接的单个语句慢,则需要使用索引和适当的查询优化数据库架构。实际上,您将IP2Proxy数据库与IP2Location数据库混淆了。IP2Location数据库包含所有没有间隙的IP地址,因此您只需从IP2Location_db3中选择*,其中IP_to>=INET_ATON'8.8.8'限制1。为了获得最佳性能,ip_to字段应该是主键,而不是其他索引。另一方面,IP2Proxy数据库不包含所有IP范围,因此需要一个子查询来优化查询。在IP2Proxy的情况下,您的查询将是最优化的。每次都正确吗?是否仅筛选ToIP字段?是。他们的数据是以这样一种方式构建的,即ToIP就足够了。为了安心,您还可以添加FromIP