优化以下查询

时间:2013-12-19 11:42:30

标签: mysql sql optimization

我有数据库表IPv4:

id          int(11) PK
ip          bigint(10)
mask        bigint(10)
broadcast   bigint(10)

我正在尝试对用户输入83.1.1.1/24进行ip地址的文本搜索,并使用以下查询进行搜索:

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

这可以完成这项工作,甚至可能更好吗?

1 个答案:

答案 0 :(得分:2)

当您使用inet_存储您的ips和面具时,您可以使用&amp;运营商比较它们?

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。

http://databaseblog.myname.nl/2011/07/working-with-ips-in-mysql-and-mariadb.html

相关问题