Mysql 以下查询的优化
我有数据库表IPv4:Mysql 以下查询的优化,mysql,sql,optimization,Mysql,Sql,Optimization,我有数据库表IPv4: id int(11) PK ip bigint(10) mask bigint(10) broadcast bigint(10) 我正在尝试对ip地址进行文本搜索,如用户输入83.1.1.1/24,我使用以下查询进行搜索: SELECT `ip`, `broadcast` FROM `IPv4` WHERE CONCAT(INET_NTOA(`ip`), "/", BIT_COUNT(`mask`))
id int(11) PK
ip bigint(10)
mask bigint(10)
broadcast bigint(10)
我正在尝试对ip地址进行文本搜索,如用户输入83.1.1.1/24,我使用以下查询进行搜索:
SELECT `ip`, `broadcast`
FROM `IPv4`
WHERE
CONCAT(INET_NTOA(`ip`), "/", BIT_COUNT(`mask`)) LIKE '%:searchStr%'
然后我想获得找到的IP地址层次结构树的路径:
SELECT DISTINCT `id` FROM `IPv4` WHERE (ip <= :ip) AND (broadcast > :broadcast)
是否可以在一个查询中完成所有查询
编辑
向前推进:
SELECT DISTINCT t2.id
FROM (
SELECT ip, broadcast
FROM IPv4
WHERE CONCAT( INET_NTOA( `ip` ) , "/", BIT_COUNT( `mask` ) ) LIKE '%:searchStr%'
) AS t1
INNER JOIN IPv4 t2
WHERE t2.ip <= t1.ip AND t2.broadcast >= t1.broadcast
ORDER BY t2.mask
这就完成了任务,可能更好?当您使用inet存储IP和掩码时,您可以使用&operator来比较它们吗
ip = inet_ntoa( '192.168.100.12' )
mask = inet_ntoa( '255.255.255.0' )
ip & mask == inet_ntoa( '192.168.100.1' ) & inet_ntoa( '255.255.255.0' )
匹配时应返回true
是的,但我不需要这个,我正在尝试创建一个文本搜索,如果用户输入完整地址或只是一个部分,它应该能够搜索,例如:2.31/24@nn4n4s:据我所知,您正在带有ip和网络掩码的表中搜索带有网络掩码的ip。也许转换填充的IP和网络掩码字符串,然后在数据库中搜索会更快。无论如何什么对你有好处: