我有一个数据库(InnoDB),其Ipv4范围表示为32位int,它们都是无符号int,并且使用其他列中的数据表示特定的IP范围(启动-ip到end-ip)。我已经分别对两列进行了索引(BTree索引类型)。
id|start-ip|end-ip
4|16777216|16777471
5|16777472|16778239
6|16778240|16779263
7|16779264|16781311
8|16781312|16785407
9|16785408|16793599
10|16793600|16809983
11|16809984|16810018
12|16810019|16810019当选择某个IP时,我可以很容易地找到一个,因为它适合一个行。但是,当我需要找到一个需要适应多行的ips范围时,我认为唯一的方法是
select * from `ips` where
(`start-ip` <= min and `end-ip` >= min)
or
(`start-ip` >= min and `end-ip` <= max)
or
(`start-ip` <= max and `end-ip` >= max)例如,尝试从16777300(min) -16779200(最大值)的范围中选择输出将是
4|16777216|16777471
5|16777472|16778239
6|16778240|16779263本质上,起始ip必须小于或等于'min‘,而结束ip必须更大或等于'max’。这可以跨越多行。
目前,我有大约10百万行ip范围的全光谱ipv4,这选择了所有的行适合范围内,然而,就性能而言,它需要几秒钟来提取数据。我怎样才能提高性能?
发布于 2020-08-27 21:35:30
您可以使用以下逻辑:
select *
from `ips`
where min <= `end-ip` and
max >= `start-ip`也就是说,一个范围先开始于另一个结束。。。反之亦然。
发布于 2020-08-28 00:30:46
MySQL/MariaDB不知道您的范围是否重叠。因此,任何明显的表述,包括戈登的表演,都很糟糕。
下面是一种可执行的方法:http://mysql.rjweb.org/doc.php/ipranges
https://stackoverflow.com/questions/63624442
复制相似问题