mysql 范围查询_mysql – 范围表中的高效查找

我有一个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

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

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

标签:mysql,sql,ruby

来源: https://codeday.me/bug/20190529/1176449.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值