MySQL之建表:IP地址的存储方法及SQL函数对索引的影响

        由于MySQL没有专门用来存储IP地址的数据类型,所以通常大部分情况是直接用varchar类型存储。这里可以使用整数类型代替,因为varchar是可变长形,需要多余的一个字节存储长度,使用int类型可以减少存储空间,提高性能。


建立一张存储IP地址的数据表address,顺便在字段login_IP上建立索引:

CREATE TABLE `address` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'primary key',
  `login_IP` int(10) DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `login_IP` (`login_IP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='IP地址表';

并插入1条数据:

INSERT INTO address (`login_IP`) VALUES ('1234567890');




inet_ntoa()函数:将整数转成IP地址;
inet_aton()函数:将IP地址转成整数;



使用inet_aton()函数将IP转换成整数查找,并分析下查询性能:

EXPLAIN SELECT *
FROM  `address`
WHERE inet_ntoa(login_IP)='73.150.2.210'



这里顺便验证了在使用WHERE查询时候,SQL函数放等号左边将使用全表扫描的访问类型,并有额外的Using where;



换个思路,使用inet_aton()函数,查询并分析性能:

EXPLAIN SELECT *
FROM  `address`
WHERE inet_ntoa(login_IP)='73.150.2.210'



可以看到SQL函数放等号右边,将成功使用利用了索引覆盖扫描的访问类型,查询性能将提高。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值