我有一個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