mysql中ip的存取设计

场景设计,数据库如何存一个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的查询效率么?(待补充)

你可能感兴趣的:(数据库)