100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > mysql ip地址查询 优化_mysql数据库字段(ip地址 时间)优化

mysql ip地址查询 优化_mysql数据库字段(ip地址 时间)优化

时间:2023-02-09 00:56:19

相关推荐

mysql ip地址查询 优化_mysql数据库字段(ip地址 时间)优化

ip的存储不要用char型 用mysql函数 inet_aton 转换成int型存储,select的时候 inet_ntoa(ip) 转义出来

时间不要用char 而是用 int 时间戳的形式,unix_timestamp() mysql 函数获取当前时间戳 , select的时候 from_unixtime(timestamp) 转成字符串的时间

这样用int存储数据在数据库的操作(select)中就会快很多

case :

创建数据库

CREATE TABLE `common` (

`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,

`ip` INT(10) UNSIGNED NOT NULL DEFAULT '0',

`addtime` INT(10) UNSIGNED NOT NULL DEFAULT '0',

PRIMARY KEY (`id`)

)

ENGINE=InnoDB

AUTO_INCREMENT=1;

插入数据

insert into common(ip,addtime) values(inet_aton('192.168.1.1'),unix_timestamp());

读取数据

select inet_ntoa(ip),from_unixtime(addtime) from common;

MySQL函数

int inet_aton(string ip) 将字符串的ip转换成int

int unix_timestamp(void) 返回当前时间戳

string from_unixtime(unix_timestamp) 根据时间戳返回字符串时间

----------------更新于 -02-13------------

上面所说的一个效率问题就是将ip转换成long型存储在数据库中,而不是以string的形式存储。如上所说,mysql提供了ip 到 long型 的相互转换过程,下面讲下php的转换以及存储:

php的转换函数是 ip2long() 和 long2ip() 。但要提醒你的是,ip2long 返回的是有符号整型,也就是说有正负之分的长整型数字。那么我们在数据库中的存储就会用 int(11) ,但是问题来啦。

在32位机上是没问题,64位机上的ip2long有时候返回的ip是会超过 无符号 int(11) 的,比如 ip202.105.77.179 ,ip2long 在64机上返回的是3395898803,这样超出了返回,当然你可以改为bigint存储,但有更好的办法。

ip2long返回的数据我们都将之转换成无符号形式

sprintf('%u',ip2long($ip))

数据库 int(11) unsigned

如下测试例子:

// ip最大值

$ip = '255.255.255.255';

echo $addr = itoa($ip)."\n";

echo atoi($addr)."\n";

function itoa($ip=''){

return sprintf('%u',ip2long($ip));

}

function atoi($addr=0){

return long2ip($addr);

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。