私は現在、他の誰かのためにスクリプトを変換しています。彼らの古いコードには、すべての IP と国をリストした CSV ファイルがありました。ファイルの形式は次のとおりです。
16777216 17367039 AU AUS AUSTRALIA
17367040 17432575 MY MYS MALAYSIA
17432576 17498111 AU AUS AUSTRALIA
17498112 17563647 KR KOR REPUBLIC OF KOREA
17563648 17825791 CN CHN CHINA
いいです、それが彼らがしたことです、私はそれを新しいMySQL DBにインポートしました。しかし問題は、ここに 111K のレコードがあることです!
比較を行い、国の IP を見つけるには、約 40 秒かかります。現在、すべてのレコードを選択し、次のフィールドより少ないフィールドと多いフィールドと比較します。
$datafile = file("iplist.csv");
$countries = array();
foreach($datafile as $data) {
$data = explode(",", $data);
foreach($iplist as $ipan => $ip) {
if($ip > $data[0] && $ip < $data[1]) {
$countries[$ip] = array($data[2], $data[4]);
}
}
}
もちろん、これがこれを行うための恐ろしい方法であることはわかっています。MySQL でそれを行うと、さらに悪いことになります。つまり、111K のレコードがただそこにあるということです。
私は一日中頭を悩ませてきましたが、とにかくこれを行うより良い方法は考えられません. IP は標準形式で DB に格納されます。私は、MySQL から select を実行し、where ステートメントで more than と less than を実行するだけだと思っていました。しかし、私の人生のために、私はその方法を考えることができます。これを考慮すると、彼らは IP リストを作成する方法です。
foreach($log as $row) {
$iplist[$row[2]] = $row[2];
if($last != "") {
$dif = $last-$row[5];
$avgtime += $dif;
}
$last = $row[5];
}
レコードごとに 1 つの呼び出しを行うことを考えましたが、各統計ページに通常 120 のレコードが表示される場合、それは mysql 最小値への 120 の呼び出しになるため、アウトです。
この比較を取得するためのより良い効率的な方法を誰か教えてもらえますか?
外部サービスを利用しようと思っていたのですが、リクエストが多すぎてサイトがブラックリストに載ってしまいそうです。