在范围表中高效查找

时间:2013-10-09 22:02:05

标签: mysql sql ruby

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

enter image description here

我有一个需要翻译成组织名称的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。

2 个答案:

答案 0 :(得分:7)

鉴于您已经拥有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_startip_end定义的范围永远不会重叠的事实。

原始方法的问题在于mysql不知道这个约束,只能使用索引来确定启动或停止扫描的位置(它认为),以便查找查询的所有匹配项。

答案 1 :(得分:0)

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

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

相关问题