场景设计,数据库如何存一个ip地址,如何设计索引和算法准确的查找一个ip与某个范围内的ip
1.创建表及相关索引
create table iptable
(
Ino int(10) PRIMARY key auto_increment,
Iadress int(10)
)
alter table iptable add index adress_index(Iadress)
insert into iptable(Iadress) VALUES (1234567890),(1234567891)
创建了一个iptable表,在Iadress上建立了索引并插入了两条数据(1234567890与1234567891分别对应点分十进制的73.150.2.210与73.150.2.211)。
2.mysql内置函数inet_ntoa()与inet_aton()
介绍两个mysql中处理ip地址的内置函数
inet_ntoa()函数:将整数转成IP地址;
inet_aton()函数:将IP地址转成整数;
3.使用inet_ntoa()与使用inet_aton()查询指定ip的执行效率比较
3.1 使用inet_ntoa()
EXPLAIN select * from iptable where INET_NTOA(Iadress) = '73.150.2.210'
通常在对索引列应用函数或表达式会使索引失效,但观察key字段发现依旧使用了索引,但是type为index,查询效率很低。
3,2 使用inet_aton()
EXPLAIN select * from iptable where Iadress = INET_ATON('73.150.2.210')
这里我们使用Inet_aton将要查找的点分十进制的ip地址转化为整数,可以看到使用了建立在Iadress上的索引,type也变成了ref,查询效率得到了很大的提升(一般查询效率达到ref级别就不会称为性能瓶颈)
查询某个范围内的ip
查询指定范围的ip,无论使用inet_ntoa()还是inet_aton(),type均为type,那么有办法提升指定范围内ip的查询效率么?(待补充)