mysql - 在范围表中进行高效查找

标签 mysql sql ruby

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

enter image description here

我有一个需要转换为组织名称的 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。

最佳答案

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

关于mysql - 在范围表中进行高效查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19283612/

相关文章:

mysql - docker-compose 应用程序和数据库之间的链接

mysql - 在 Ubuntu 14.04 上为 MySQL 设置 SSL 连接时出现问题

Mysql主数据库使用情况

mysql - 我如何选择每支球队的最后五场比赛并确定胜/负/平局?

java - 捕获导致表溢出的 ORACLE 查询

mysql - 限制一列的结果

ruby - Mechanize 'link_with' 产生不同的 URL

mysql - 加入 MySQL 时转置数据

ruby - 导轨 : submit Ajax form via anchor click

ruby - 如何与 Autotest 同时运行 Ruby 调试器?