我有一个geoencoding数据库,每行有 fromip
(长)toip
(长)的整数范围(IP地址等效)。整数是从ip地址创建ip2long在mysql中查询ip范围的最有效方法
我需要找到一个给定的IP地址(转换为长)在该范围内的行。
什么是最有效的方法呢? (密钥和查询)
如果我这样做(天真的解决方案)select * from ipranges where fromip <= givenip and toip >= givenip limit 1
和密钥是fromip, toip
。那么对于ip地址不在任何给定范围内的情况,搜索遍历所有行。
一些更多的信息:
解释SELECT * FROM ipranges其中 ipfrom < = 2130706433和IPTO> = 2130706433为了通过ipfrom升序 极限1 |
给我2.5M行(表中总共3.6M)。 的关键是:
PRIMARY KEY(
ipfrom
,ipto
)
,似乎并没有被有效的。 (上面的ip不在这个范围内)
您正面临'棋盘'问题:http://use-the-index-luke.com/sql/where-clause/searching-for-ranges/index-combine-performance – 2011-01-25 08:50:43