首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于IP向我的国家展示mysql优化

基于IP向我的国家展示mysql优化
EN

Stack Overflow用户
提问于 2010-06-17 15:36:39
回答 2查看 1.4K关注 0票数 1

我已经从http://www.wipmania.com/en/base/下载了WIPmania的worldip表--该表有3个字段和大约79000行:

3363110912

  • endip // :3363112063
  • country // :AR (阿根廷)

假设我在阿根廷,我的IP地址是: 200.117.248.17

1)我使用这个函数将我的ip转换成long

代码语言:javascript
复制
function ip_address_to_number($ip) {
    if(!$ip) {
        return false;
    } else {
        $ip = split('\.',$ip);
        return($ip[0]*16777216 + $ip[1]*65536 + $ip[2]*256 + $ip[3]);
    }
}

2) I通过匹配经过长时间转换的ip来搜索适当的国家代码:

代码语言:javascript
复制
$sql = 'SELECT * FROM worldip WHERE '.ip_address_to_number($_SERVER['REMOTE_ADDR']).' BETWEEN startip AND endip';

这相当于:从worldip中选择了一个国家,在那里,星端和endip之间为3363174417 (基准:显示行0-0 (1次总计,查询耗时0.2109秒))。

现在,真正的问题出现了。

如果另一群阿根廷人也打开网站,他们都有这些ip地址,那该怎么办呢?

  • 200.117.248.17
  • 200.117.233.10
  • 200.117.241.88
  • 200.117.159.24

由于我正在缓存所有sql查询;与其匹配数据库中的每个ip查询,不如通过这样修改函数来匹配ip的前2部分(也是正确的)吗?

代码语言:javascript
复制
function ip_address_to_number($ip) {
    if(!$ip) {
        return false;
    } else {
        $ip = split('\.',$ip);
        return($ip[0]*16777216 + $ip[1]*65536);
    }
}

(注意,IP的第3和第4分裂值已被删除)。

这样就不用查询这4个值了:

  • 3363174417
  • 3363170570
  • 3363172696
  • 3363151640

我必须查询的...all是: 3363110912 (这是200.117。0.0转换为long)。

是这样的吗?还有其他方法来优化这个过程吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-17 17:02:46

你一定要使用WIPmania吗?如果不是,Maxmind提供了一个开源解决方案:http://www.maxmind.com/app/geolitecountry。它的优点是它是一个二进制文件,并且有一个PHP扩展名(您必须编译它并安装它)。在几个项目中使用它,查找的速度很快。您可以在这里获得PCL扩展:http://pecl.php.net/package/geoip

票数 1
EN

Stack Overflow用户

发布于 2010-06-17 15:53:15

不是的。

193.150.1.1 -俄罗斯IP 193.150.230.1 -瑞典IP

你可能会把它截断到前三位,但是.你不会有那么多的缓存点击。而且很有可能一些/24网络被分成两个部分。有时,会给出比/24小的块。

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

https://stackoverflow.com/questions/3063192

复制
相关文章

相似问题

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