MySQL将IP存储为int以获得更高的性能?

yos*_*shi 4 php mysql database

我有一个每秒钟有很多查询的数据库.查询搜索IP地址值.那么将IP(例如34.549.53.23)存储为int值:345495323是否合理?查询会更快吗?

我知道例如123.12.3.123和123.1.2.3.1.2.3都存储为123123123但这没关系.

hek*_*mgl 8

虽然我认为这是微优化,但您可以使用该函数ip2long()将IP地址的ascii表示转换为32位整数并将long2ip()其转换回来.

试试吧:

$int = ip2long('192.168.0.1');
echo $int; // 3232235521

$ip = long2ip(3232235521);
echo $ip; // 192.168.0.1
Run Code Online (Sandbox Code Playgroud)

顺便说一句,IP的字符串表示和它的整数表示之间的转换工作不像你期望的那样.你看到192.168.0.1是转换不以19216801.看,很明显,这不能被重新转换.是19.216.80.1还是192.168.0.1?

IP地址是32位整数,以二进制格式存储(如任何数字).让我们来看看二进制表示3232235521 (192.168.0.1):

11000000 10101000 00000000 00000001
Run Code Online (Sandbox Code Playgroud)

我已经分成8位单位(字节)以提高可读性.这就是计算机所看到的.但这对人类来说很难记住.

该ascii表示将通过将每个字节的值转换为十进制并通过以下方式将它们分开来构建.:

11000000 => 192
10101000 => 168
00000000 =>   0
00000001 =>   1
Run Code Online (Sandbox Code Playgroud)

什么给了你192.168.0.1,人类更容易记住什么.(除了有关子网组可读性的其他一些优点)


小智 5

是的,查询会更快.另外,要将IP保存为整数,请使用mysql INET_ATON()并从整数使用中获取IP地址INET_NTOA().请参阅此页面以获取更多信息

http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html

如果你正在尝试PHP,你可以使用ip2long()和long2ip()反之亦然

请参阅http://www.php.net/manual/en/function.ip2long.php