高效地搜索IP范围PHP和MySQL

时间:2016-10-13 17:02:37

标签: php mysql

我有一个大约有100,000个IP范围条目的数据库,我的网站会拒绝这些条目。

存储这些范围的表格格式为

ip_from (int)
ip_to (int)

使用PHP我使用ip2long

将用户IP转换为整数值

然后,我使用以下SQL查询来确定用户IP是否存在于表中的范围内。

SELECT `ip_from` 
FROM `ip2location_proxy`
WHERE '".$ip."' BETWEEN ip_from AND ip_to LIMIT 1

问题在于这是在创建大型服务器负载。我想知道是否有人可以建议一种更好的方法来检测IP是否在数据库中指定的范围内,例如使用BETWEEN命令的替代方法。

2 个答案:

答案 0 :(得分:1)

假设您的索引很好并且您运行的是一个不那么低功耗或慢速的磁盘访问系统,那么我建议如下:

如果您发现自己拥有较大的白名单范围,例如0 - 2147483648,那么您可以先尝试确保IP不在白名单范围内,然后咨询您的数据库。

<?php
if($ip > 2147483648)
{
    // consult the ip2location_proxy table
}

另外,查看https://www.ip2location.com/databases/px2-ip-country上的示例数据,也许您可​​以尝试删除不需要的列ip_fromip_to

答案 1 :(得分:1)

我们与BETWEEN有类似的问题。尝试使用UNION进行两个单独的查询。老实说,我不知道为什么这个比较快,而BETWEEN很慢。

SELECT `ip_from` 
FROM `ip2location_proxy`
WHERE '".$ip."' >= ip_from

UNION ALL

SELECT `ip_from` 
FROM `ip2location_proxy`
WHERE '".$ip."' <= ip_to