在mysql中查询ip范围的最有效方法

时间:2011-01-25 08:25:07

标签: mysql geocoding

我有一个geoencoding数据库,每行都有整数范围(相当于ip地址) fromip(长)toip(长)。整数是通过php ip2long

从ip地址创建的

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

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

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

更多信息:

  

解释select * from ipranges where   ipfrom&lt; = 2130706433和ipto&gt; =   2130706433订购ipfrom Asc   限制1 |

给了我2.5M行(表中总共3.6M)。 关键是:

  

PRIMARY KEY(ipfromipto

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

1 个答案:

答案 0 :(得分:0)

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

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