在范围表中高效查找

git*_*itb 5 ruby mysql sql

我有一个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
Run Code Online (Sandbox Code Playgroud)

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

Wal*_*oss 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
Run Code Online (Sandbox Code Playgroud)

这将使用您的索引启动扫描,因为该扫描立即停止limit 1.成本应仅略高于简单索引访问的成本.当然,这种技术依赖于由定义的范围ip_start并且ip_end从不重叠的事实.

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