1

maxmind データベースを使用して、ある IP の都市を見つけようとしています。( http://www.maxmind.com/app/geolitecity ) 2 つのテーブルがあります:
1 番目のテーブル列:
startIpNum,endIpNum,locId
2 番目のテーブル列:
locId,country,region,city,postalCode,latitude,longitude,metroCode,areaCode
簡単な説明: 最初のテーブルを使用してテーブルの場所 ID を取得し、2 番目のテーブルからその場所の情報を取得できます。では、プロセスの 2 番目の部分については忘れましょう。最初の部分を達成するために mysql を使用し、locId を取得するために次のコードを使用します。

SELECT locId FROM first_table WHERE startIpNum<=IP and endIpNum>=IP LIMIT 1

IP が a*256*256*256+b*256*256+c*256+d の場合 (ip => abcd から、例 197.248.67.1、a=197、b=248... など)、これは次のことを意味します。整数間の比較について話していること。ここに問題があります。この操作は遅すぎます。2 番目に考えたのは、インデックスを使用することだったので、次のようなインデックスを使用しようとしました。

CREATE INDEX test ON first_table ( startIpNum,endIpNum,locId)

多分それは世界最高の指標ではないかもしれませんが、それが私の問題に対する最善の解決策だと思いました...そしてそうではありません. プロセスはまだ 10 秒程度とかなり遅いです。何か案は????ちなみに、このテーブルには約 350 万行あります。しかし、私はそれが演算子よりも小さいこととよりも大きいことの問題を知っていますが、他に何ができるかわかりません。ご協力ありがとうございました。

4

1 に答える 1

0

あなたの質問からいくつかのことが明確ではありません:

1 つの IP を検索するのに 10 秒かかりますか?

都市を見つけるために探している IP アドレスはいくつありますか?

これらの 2 つのテーブルは maxmind CSV 形式から作成されたものですか、それともあなたのデータですか?

maxmind データベースの CSV 形式を使用しましたか? バイナリ形式を使用することをお勧めします。これははるかに高速です。

于 2012-04-13T11:14:01.397 に答える