IP地址库在网上很多 建议用关键字 珊瑚虫 去查找。
找到了这样的ip区间 对应着相应的地区--》导入表。
为了方便程序查找 而且效率要高 最好是把开始ip 结束ip 换算成整数形式。
传进来的ip也可以转化为整数
在开始结束的整数 字段上面加上索引后 大约44万 记录查找一行数据的时间
本机大约是0.02s 效率还是不错的。
并且建立表
CREATE TABLE `ip_address_pool` (
`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`start_ip` varchar(20) NOT NULL COMMENT '起始ip',
`end_ip` varchar(20) NOT NULL COMMENT '截止ip',
`region_name` varchar(128) NOT NULL COMMENT '地区名',
`company_name` varchar(128) NOT NULL COMMENT '备注',
`start_ip_Decimal` bigint(10) DEFAULT NULL,
`end_ip_Decimal` bigint(10) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_start_ip_Decimal` (`start_ip_Decimal`),
KEY `idx_end_ip_Decimal` (`end_ip_Decimal`)
) ENGINE=InnoDB AUTO_INCREMENT=436820 DEFAULT CHARSET=utf8 COMMENT='ip地址对应表';
函数:
-- ip 是传进来的ip地址 a.b.c.d
-- 远离是 a,b,c,d的值的区间是 0--255 正好可以把ip视为256进制的数字
然后转化为10进制的整数 d*1+c*256+b*256*256+a*256*256*256
drop function if exists func_get_split_string;
create function `ip_calc`(ip varchar(15)) returns bigint(20)begin
declare rs bigint(20) default 0;
set rs=substring_index(ip,'.',1)*256*256*256+substring_index(substring_index(ip,'.',2),'.',-1)*256*256+ substring_index(substring_index(ip,'.',3),'.',-1)*256+substring_index(ip,'.',-1);
return rs;
end