5

我有一个包含组织名称的 1.6M IP 范围的表。IP 地址被转换为整数。该表的形式为:

在此处输入图像描述

我有 2000 个需要转换为组织名称的唯一 IP 地址(例如 321223、531223、...)的列表。

我将翻译表加载为 mysql 表,并在IP_fromIP_to上有一个索引。我遍历了 2000 个 IP 地址,每个 IP 地址运行一个查询,15 分钟后报告仍在运行。我正在使用的查询是

select organization from iptable where ip_addr BETWEEN ip_start AND ip_end

有没有更有效的方法来进行批量查找?如果这是一个好的解决方案,我会用我的手指。如果有人有特定于 Ruby 的解决方案,我想提一下我正在使用 Ruby。

4

2 回答 2

8

鉴于您已经有一个索引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 不知道此约束,只能使用索引来确定从哪里开始或停止(它认为)它需要的扫描,以便找到您的查询的所有匹配项。

于 2013-10-09T22:19:17.573 回答
-1

进行此类查找的最有效方法可能是将要查找的地址列表加载到数据库中的临时表中,并使用 SQL 连接查找交集,而不是使用单独的 SQL 语句检查每个地址。

在任何情况下,您都需要在 (IP_from, IP_to) 上有一个索引。

于 2013-10-09T22:18:47.043 回答