【问题标题】:The most efficient way to query ip ranges in mysql在mysql中查询ip范围的最有效方法
【发布时间】:2011-01-25 08:25:07
【问题描述】:

我有一个地理编码数据库,每行都有整数范围(相当于 IP 地址) fromip(长)toip(长)。整数是由 php ip2long 从 ip 地址创建的

我需要找到给定IP地址(转换为长)在该范围内的行。

最有效的方法是什么? (键和查询)

如果我这样做(天真的解决方案)select * from ipranges where fromip <= givenip and toip >= givenip limit 1 并且 keyfromip, toip。然后对于 IP 地址不在任何给定范围内的情况,搜索将遍历所有行。

更多信息:

解释 select * from ipranges where ipfrom = 2130706433 由 ipfrom Asc 订购 限制1|

给了我 250 万行(表中总共 360 万行)。 关键是:

主键 (ipfrom,ipto)

这似乎根本没有效率。 (上面的ip不在任何范围内)

【问题讨论】:

标签: mysql geocoding


【解决方案1】:

您的查询很好,在 (fromip, toip) 上放置一个索引,该索引将作为查询的覆盖索引。根本不需要检查表,只搜索排序后的索引,这是尽可能快的。

搜索实际上不会遍历所有行。它不仅不会遍历任何行,只会遍历索引,而且它也不会检查索引中的每个条目。索引存储为排序树,只需遵循一条穿过该树的路径即可确定您的 IP 不在表中。

【讨论】:

  • 请参阅上面的更多信息。我认为它的效率不够。解释说扫描了 250 万行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-08
  • 1970-01-01
  • 2019-05-20
  • 2013-01-24
  • 2017-01-01
  • 2017-04-26
相关资源
最近更新 更多