首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >million+记录的ip2location查询

million+记录的ip2location查询
EN

Stack Overflow用户
提问于 2013-07-12 17:39:48
回答 5查看 2.2K关注 0票数 3

我订阅了一个ip2location服务,它为我提供了一个以下格式的SQL表

代码语言:javascript
复制
FromIP (int), ToIP(int), lat, long, city  etc etc 

我想解析我的访问日志并对所有用户进行分类,访问日志具有IP地址和用户IP(例如)

因此,我运行如下查询

代码语言:javascript
复制
select city from ip2location where FromIP <= $ipAsInt  AND ToIP => $ipAsInt

但是这对于我必须解析的million+记录来说太耗时了。我猜这一定是ip2location的一种非常常见的用法。有没有可能优化结构?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-07-22 20:13:32

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

像这样

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2013-12-03 21:17:59

您还可以像这样编写查询

代码语言:javascript
复制
select city,ToIP from ip2location where ToIP >= $ipAsInt order by ToIP limit 1

这将比以前快得多。

您还可以为ToIP列建立索引,以提高性能。

正如ip2location所建议的,您可以使用以下命令创建FromIP和ToIP的复合主键

代码语言:javascript
复制
ALTER TABLE ip2location ADD PRIMARY KEY(FromIP,ToIP);
票数 2
EN

Stack Overflow用户

发布于 2017-04-27 06:39:42

事实证明,您可以比LIMIT 1做得更好!

ip2location website here上,它显示了使用子查询是如何将速度提高了几个数量级

SELECT * FROM ( SELECT * FROM ip2location_db3 WHERE ip_to >= INET_ATON('8.8.8.8') LIMIT 1 ) AS tmp WHERE ip_from <= INET_ATON('8.8.8.8')

在我的MacBook测试中,不同的IP地址花费了不同的时间。性能最差的IP地址具有以下性能:

在不带LIMIT 1

  • 300ms的情况下使用BETWEEN
  • 14使用带LIMIT 1
  • 2ms的BETWEEN使用子选择上面的

这是7000倍的速度!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17611926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档