Benim IP tabanlı ülkeme gösteren, mysql optimize

0 Cevap php

I http://www.wipmania.com/en/base/ adlı WIPmania en worldip masa indirdiğiniz - tablo 3 alanları ve çevresinde 79k satırlar vardır:

  • StartIP / / örnek: 3363110912
  • EndIP / / örnek: 3363112063
  • ülke / / örnek: AR (Arjantin)

Yani, Arjantin değilim herhalde izin verir ve benim IP adresi: 200.117.248.17

1) Ben uzun benim ip dönüştürmek için bu işlevi kullanın

function ip_address_to_number($ip) {
    if(!$ip) {
        return false;
    } else {
        $ip = split('\.',$ip);
        return($ip[0]*16777216 + $ip[1]*65536 + $ip[2]*256 + $ip[3]);
    }
}

2) Ben uzun dönüştürülebilir ip eşleştirerek uygun ülke kodu arayın:

$sql = 'SELECT * FROM worldip WHERE '.ip_address_to_number($_SERVER['REMOTE_ADDR']).' BETWEEN startip AND endip';

which is equivalent to: SELECT country FROM worldip WHERE 3363174417 BETWEEN startip AND endip (benchmark: Showing rows 0 - 0 (1 total, Query took 0.2109 sec))

Now comes the real question.

Arjantinli çocuklar başka bir grup da web sitesi açmak ve ne varsa hepsi bu ip adresleri var:

  • 200.117.248.17
  • 200.117.233.10
  • 200.117.241.88
  • 200.117.159.24

Ben tüm sql sorguları önbelleğe ediyorum bu yana; yerine veritabanında ip sorguları HER eşleşen, bu gibi işlev değiştirerek sadece ip ve 2 ilk bölümleri maç için (sağ ve) daha iyi olurdu?

function ip_address_to_number($ip) {
    if(!$ip) {
        return false;
    } else {
        $ip = split('\.',$ip);
        return($ip[0]*16777216 + $ip[1]*65536);
    }
}

(IP 3. ve 4. Bölünmüş değerler kaldırılmış olduğunu fark).

Yerine bu 4 değerlerini sorgulayarak bu yolu:

  • 3363174417
  • 3363170570
  • 3363172696
  • 3363151640

... I sorgulamak zorunda hepsi: 3363110912 (200,117 olan 0.0 Uzun dönüştürülür.).

Bu doğru mu? Bu süreci iyileştirmek için başka bir fikir?

0 Cevap