Mysql 以下查询的优化

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`))

我有数据库表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`)) 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和网络掩码字符串,然后在数据库中搜索会更快。无论如何什么对你有好处: