2011-01-25 96 views
1

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

,似乎并没有被有效的。 (上面的ip不在这个范围内)

+0

您正面临'棋盘'问题:http://use-the-index-luke.com/sql/where-clause/searching-for-ranges/index-combine-performance – 2011-01-25 08:50:43

回答

0

你的查询很好,把索引放在(Fromip,toip)上,这将是查询的覆盖索引。这个表格根本不需要检查,只有被排序的索引被搜索到,这是尽可能快的。

搜索实际上不会遍历所有行。它不仅会遍历所有行,而且还会遍历索引,但它不会检查索引中的每个条目。索引存储为排序树,并且只有通过该树的一条路径才能确定您的IP不在表中。

+0

请参阅上面的更多信息。我不认为它的有效性。解释说2.5M行扫描 – Nir 2011-01-25 08:49:45