IP を数値に変換することを検討してください。数値データであり、クエリで INET_ATON() と INET_NTOA() を使用できるため、ルックアップが少し速くなります。
http://dev.mysql.com/doc/refman/5.5/en/miscellaneous-functions.html#function_inet-aton
mysql> SELECT INET_ATON('10.0.5.9');
-> 167773449
http://dev.mysql.com/doc/refman/5.5/en/miscellaneous-functions.html#function_inet-ntoa
mysql> SELECT INET_NTOA(167773449);
-> '10.0.5.9'
数値に変換する PHP
$ipA = $_SERVER["REMOTE_ADDR"];
$octets = split ("\.", $ipA);
$ipN = ($octets[3] + $octets[2] * 256 + $octets[1] * pow(256,2) + $octets[0] * pow(256,3);
また、この関数で使用している IP アドレスを考慮することもできます。
/* Get Actual IP Address, in spite of proxy server */
function getRealIpAddr() {
if (!empty($_SERVER['HTTP_CLIENT_IP'])) //check ip from share internet
{ $ip=$_SERVER['HTTP_CLIENT_IP']; }
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) //to check ip is pass from proxy
{ $ip=$_SERVER['HTTP_X_FORWARDED_FOR']; }
else
{ $ip=$_SERVER['REMOTE_ADDR']; }
return $ip;
}
RE - IPv6 の編集:
原則はすべて引き続き適用されますが、MySQL でのストレージ用に IPv6 をバイナリから変換する方法で IPv6 変換は既に回答されています