J'ai téléchargé la table worldip de WIPmania de http://www.wipmania.com/en/base/ - la table a 3 champs et autour 79k lignes:Afficher mon pays basé sur mon IP, mysql optimisé
- IPDébut // exemple: 3363110912
- endip // exemple: 3363112063
- pays // exemple: AR (Argentine)
Alors, laisse supposer que je suis en Argentine et mon adresse IP est: 200.117.248.17
1) J'utilise cette fonction pour convertir mon ip à longue
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) je recherche le code approprié du pays en faisant correspondre long ip converti:
$sql = 'SELECT * FROM worldip WHERE '.ip_address_to_number($_SERVER['REMOTE_ADDR']).' BETWEEN startip AND endip';
qui est équivalent à: SELECT pays FROM worldip O WH 3363174417 ENTRE startip ET endip (repère: Affichage des lignes 0 - 0 (1 total, Requête a pris 0.2109 sec))
Maintenant vient le réelquestion.
si un autre groupe de gars argentinian ouvrir aussi le site et ils ont tous ces adresses IP:
- 200.117.248.17
- 200.117.233.10
- 200.117.241.88
- 200.117.159.24
Depuis que je suis en cache toutes les requêtes sql; Au lieu de correspondre CHACUNE des requêtes ip dans la base de données, serait-il préférable (et juste) de simplement faire correspondre les 2 premières sections de l'IP en modifiant la fonction comme ceci?
function ip_address_to_number($ip) {
if(!$ip) {
return false;
} else {
$ip = split('\.',$ip);
return($ip[0]*16777216 + $ip[1]*65536);
}
}
(remarquez que les valeurs 3 et 4 fractionnées de l'adresse IP ont été supprimées).
De cette façon, au lieu d'interroger ces 4 valeurs:
... tout ce que je dois requête est: 3.363.110.912 (qui est de 200,11 0,0 converti en long).
Est-ce exact? d'autres idées pour optimiser ce processus?
qu'en est-il des utilisateurs proxy? –
Si vous venez de lancer un index sur la colonne worldip, les requêtes devraient être rapides. Je parie que les requêtes se termineront en moins de 10 ms. Reportez-vous à ce que vous avez, une fois l'indice en place. Si vous ne l'avez pas déjà fait, vous optimisez prématurément. –
@Srinivas: je peux obtenir ceux avec getenv ('HTTP_X_FORWARDED_FOR'); - Je ne l'ai pas encore ajouté à ce code. @Frank: le fait est que ce site a environ 3 millions de visites par mois. je ne peux pas référencer ce nombre de requêtes jusqu'à ce que ce code soit actif - c'est pourquoi je dois optimiser prématurément;) - j'ajouterai cependant un index: PRIMARY start end – andufo