由于MySQL没有专门用来存储IP地址的数据类型,所以通常大部分情况是直接用varchar类型存储。这里可以使用整数类型代替,因为varchar是可变长形,需要多余的一个字节存储长度,使用int类型可以减少存储空间,提高性能。
inet_aton()函数:将IP地址转成整数;
这里顺便验证了在使用WHERE查询时候,SQL函数放等号左边将使用全表扫描的访问类型,并有额外的Using where;
换个思路,使用inet_aton()函数,查询并分析性能:
可以看到SQL函数放等号右边,将成功使用利用了索引覆盖扫描的访问类型,查询性能将提高。
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_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函数放等号右边,将成功使用利用了索引覆盖扫描的访问类型,查询性能将提高。