我有一个包含组织名称的 1.6M IP 范围表。 IP 地址被转换为整数。该表的形式为:
我有一个需要转换为组织名称的 2000 个唯一 IP 地址(例如 321223、531223...)的列表。
我将转换表加载为 mysql 表,并在 IP_from 和 IP_to 上建立了索引。我遍历了 2000 个 IP 地址,对每个 IP 地址运行一个查询,15 分钟后报告仍在运行。 我正在使用的查询是
select organization from iptable where ip_addr BETWEEN ip_start AND ip_end
是否有更有效的方法来执行此批量查找?如果这是一个好的解决方案,我会用我的手指。如果有人有特定于 Ruby 的解决方案,我想说明我正在使用 Ruby。
最佳答案
假设您已经在 ip_start
上有一个索引,这是使用它的最佳方式,假设您希望每个 IP 进行一次访问(本例中为 1234
):
select organization from (
select ip_end, organization
from iptable
where ip_start <= 1234
order by ip_start desc
limit 1
) subqry where 1234 <= ip_end
这将使用您的索引开始扫描,由于 limit 1
而立即停止。成本应该只略高于简单索引访问的成本。当然,这种技术依赖于 ip_start
和 ip_end
定义的范围从不重叠这一事实。
你原来的方法的问题是,mysql 不知道这个约束,只能使用索引来确定从哪里开始或停止(它认为)它需要的扫描,以便为你的查询找到所有匹配项。
关于mysql - 在范围表中进行高效查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19283612/