php查询mysql判断ip段_php和mysql关于ip段查询

背景:项目中有个小需求需要统计某个地区在某个时间段的注册用户数,已经提供该地区对应的ip段,注册数据表中存有注册用户ip。

初期的想法是:完善ip段内的所有ip数,形成一个列表,然后用注册用户ip字段进行in查询。

实施的时候出了以下问题:

1.读取ip段文件,完善150多个ip段时出现了1000多W的ip信息。完善ip段信息,主要是通过 ip2long() 函数和 long2ip() 函数(先将ip段的起始ip和结束ip均转为长整形,然后完善长整形之间的值,并每个都转回ip信息)。

2.注册表的数据量在5000W左右,in 查询ip列表,测试1000个ip查时耗时到60s

改善后的想法:考虑到php有转换ip和long类型的参数,果断百度了下mysql是否有。幸运的是,mysql足够强大也有对应的 inet_aton() 和 inet_ntoa() 函数

改善后的做法是直接在mysql端进行转换比较,如下:

select count(userId) as user_num,date_format(FROM_UNIXTIME(`addtime`),'%y%m') sdate

from t_user_attr

where addtime >= unix_timestamp("2014-09-01 00:00:00")

AND addtime < unix_timestamp("2014-10-31 23:59:59")

AND inet_aton(regIp) >= inet_aton("1.34.0.0") AND inet_aton(regIp)<=inet_aton("1.35.255.255")运行的效果是:

测试ip段包含ip数达近20W个时,查询用户id用了23 s左右 (测试ip段为 60.248.0.0|60.251.255.255)

总结:当数据量级大了起来后,以前体现不出的性能就会很明显。

上面的sql还可以优化下,将条件里时间的比较在php端完成(时间字符串转时间戳),不在mysql端转换。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值