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函数放等号右边,将成功使用利用了索引覆盖扫描的访问类型,查询性能将提高。

你可能感兴趣的:(MySQL)