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) 根据时间戳返回字符串时间


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


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

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

在32位机上是没问题,64位机上的ip2long有时候返回的ip是会超过 无符号 int(11) 的,比如 ip 202.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);
}







  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值