2011-01-25 16 views
1

各行に整数の範囲(IPアドレス相当)のジオコーディングデータベースがあります。 fromip(long)toip(long)整数はIPアドレスからphp ip2longで作成されますmysqlのIP範囲を照会する最も効率的な方法

与えられたIPアドレス(longに変換)が範囲内にある行を見つける必要があります。

これを行う最も効率的な方法は何でしょうか? (キーとクエリ)

select * from ipranges where fromip <= givenip and toip >= givenip limit 1のキーfromip, toipです。 IPアドレスが指定された範囲にない場合、検索はすべての行を通過します。

SOME MORE INFO:

ipfrom < = 2130706433とipfrom昇順 リミット1によってIPTO> = 2130706433ためipranges SELECT * FROM説明|

は私に2.5M行(表では合計3.6M)を与えます。 キーは、次のとおりです。すべてで効率的ではないようです

PRIMARY KEY(ipfromipto

。 (上のipは範囲にありません)

+0

「チェス盤」の問題に直面しています:http://use-the-index-luke.com/sql/where-clause/searching-for-ranges/index-combine-performance –

答えて

0

あなたのクエリは問題ありません。クエリのカバーインデックスになるインデックスを(fromip、toip)に入れてください。テーブルはまったく調べる必要はなく、ソートされたインデックスだけが検索されます。できるだけ速いです。

検索が実際にすべての行を通過することはありません。行だけを通過するだけでなく、索引だけを通過するだけでなく、索引内のすべてのエントリも検査されません。インデックスはソートされたツリーとして格納され、IPがテーブルにないと判断するためには、そのツリー内の1つのパスだけを辿る必要があります。

+0

上記の詳細情報をご覧ください。私は十分に効率的だとは思わない。説明は2.5Mの行をスキャンした – Nir

関連する問題