2011-01-25 61 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