こんにちは、Habrahabr! 私の名前はマキシム・バビチェフです。 これはHabrahabrに関する私の最初の記事です。厳密に判断しないでください。
Habré
の記事で 、
国と都市 、そして
唯一の国という 2つの修正のベースがありました。 また、これらのアーカイブには、phpでテーブルを使用する小さな例があります。
この記事は初心者向けであり、上級の達人向けではないことをすぐに言いたいと思います。
SQLクエリにもっと興味があります。
LONG_IP_ADDRESS、
PHPの ip2long()関数を使用して取得した
数値 。
クエリ(1)の後、net_cityテーブルから目的の都市を取得します。
PHPの例のコード:
<?php
ANDを使用して、クエリ(1)のサブクエリを取り除きます。
この場合、サブクエリを取り除きます。 しかし、BETWEENを思い出して、次のようなクエリを作成しましょう。
したがって、SQLコードはより読みやすく、短くなります。
市には別のリクエストがありました。 変更されたクエリ(4)と(2)を組み合わせます。
そのため、net_ruデータベースのIPアドレス79.134.219.2はそうではありません。 ただし、net_city_ipデータベースにあります。
多くのリソースは、次のようなクエリを組み合わせます。
リクエストが同一であることがわかります。 JOIN内で2つのリクエストを組み合わせると、次のようになります:
変更されたクエリ(5.2)は便利ですが、すべてのフィールドが必要なわけではありません。
引き出す:
- name_ru
- name_en
- 地域
- postal_code
- 緯度
- 経度
次に、ユーザーがいる国を選択する必要があります。 JOIN接続をリクエストに追加します。
要求をテストします。
これを行うには、PHPで値LANG_IP_ADDRESSを取得します。
<?php echo ip2lang('79.134.219.2');
リクエストでそれを置き換えて、phpMyAdminで実行します。
クエリの結果:
合計1回、リクエストには0.3408秒かかりました。
JOIN接続は、クエリの実行速度に大きく影響します。 WHEREでJOINを書く
変更されたリクエストをテストします。
WHEREを使用したクエリの変更 SELECT DISTINCT `city`.`name_ru` `city_name_ru`, `city`.`name_en` `city_name_en`, `city`.`region`, `city`.`postal_code`, `city`.`latitude`, `city`.`longitude`, `country`.`name_ru` `country_name_ru`, `country`.`name_en` `country_name_en`, `country`.`code` FROM `net_city` `city` JOIN `net_country` `country` ON `country`.`id` = `city`.`country_id` WHERE `city`.`id` = ( SELECT `city_id` FROM `net_city_ip` WHERE 1334237954 BETWEEN `begin_ip` AND `end_ip` UNION SELECT `city_id` FROM `net_ru` WHERE 1334237954 BETWEEN `begin_ip` AND `end_ip` )
クエリの結果:
合計1回、リクエストには0.1527秒かかりました。
変更されたリクエストは2倍以上速く完了しました。
国についても同様のリクエストを取得できます。
このGeo-IPデータベースは、JOIN / UNION接続とクエリの最適化を説明するために選択されました。
この記事が初心者にとって最適化がいかに重要で、どのように達成できるかを理解する助けになることを願っています。
tuta_larsonによる
記事を読むことをお勧めし
ます 。
このGeo-IPベースは非常に古く、ごく少数のIPアドレスを知っています。 ただし、IPベースを作成し、ユーザーの助けを借りて補充することができます。
次に、IP評価を行い、独自の評価に基づいて、ユーザーのいる都市を「推測」します。
GeoIPに関するデータベースと情報は、記事
「GeoIPデータベース-国と都市、2013年9月」から引用されてい
ます 。 2013年に書かれた興味深い記事を提供してくれた
netloadに感謝します。