1

MySQLサーバーにDBがあり、IP範囲と場所に関する情報があり、次の構造を持っています:

id (integer not null, auto inc)
from_ (bigint(20))
to_ (bigint(20))
region(integer)

フィールド region は、テーブルcitys (id, city_name) の外部キーです。

ご存知のように、IP アドレスが属する国を見つけるには、次のクエリのようなものを実行する必要があります。

select region from ipcountry where ip >= from_ and ip <= to_

レコードの数が原因で、必要なものに対してクエリが遅すぎます。

この問題を最適化するためのアイデアはありますか?

4

1 に答える 1

0

に索引がありますか(from_, to_)。それが出発点です。

次に、次のアイデアは、インデックスを取得し、クエリを次のように変更することです。

select region
from ipcountry
where ip >= from_
order by from_ desc
limit 1;

それでもパフォーマンスが向上しない場合は、データ構造を最適化する方法を検討する必要があります。ここでの極端なアプローチは、すべての IP アドレスとその地域を一覧表示することです。ただし、結果として得られる数十億行は、実際にはパフォーマンスを妨げる可能性があります。

この道を行くなら、もっと賢くなる必要があります。1 つのアイデアは、定数領域を持つタイプ A、タイプ B、およびタイプ C のアドレスに個別のテーブルを用意することです。次に、タイプ D アドレスの範囲の別の表。

于 2013-05-23T00:57:50.447 に答える