我有一个geoencoding数据库,每行都有整数范围(相当于ip地址)
fromip
(长)toip
(长)。整数是通过php ip2long
我需要找到给定ip地址(转换为long)在该范围内的行。
最有效的方法是什么? (键和查询)
如果我这样做(天真的解决方案)select * from ipranges where fromip <= givenip and toip >= givenip limit 1
而键是fromip, toip
。然后,对于ip地址不在任何给定范围内的情况,搜索遍历所有行。
更多信息:
解释select * from ipranges where ipfrom&lt; = 2130706433和ipto&gt; = 2130706433订购ipfrom Asc 限制1 |
给了我2.5M行(表中总共3.6M)。 关键是:
PRIMARY KEY(
ipfrom
,ipto
)
似乎根本没有效率。 (上面的ip不在任何范围内)
答案 0 :(得分:0)
您的查询没问题,在(fromip,toip)上放置一个索引,它将成为查询的覆盖索引。根本不需要检查该表,只搜索已排序的索引,这是尽可能快的。
搜索实际上不会遍历所有行。它不仅不会遍历任何行,只会遍历索引,但它也不会检查索引中的每个条目。索引存储为已排序的树,并且只需遵循该树中的一条路径即可确定您的IP不在表中。