如何改进在大型数据库中查找重复条目的MySql查询?
我必须对大型数据库Snort警报进行查询,以查找重复条目。然而,我提出了下面的查询,但执行起来需要很多时间如何改进在大型数据库中查找重复条目的MySql查询?,mysql,dataset,acid,snort,Mysql,Dataset,Acid,Snort,我必须对大型数据库Snort警报进行查询,以查找重复条目。然而,我提出了下面的查询,但执行起来需要很多时间 SELECT sid, cid, timestamp, sig_name, inet_ntoa(ip_src), layer4_sport, inet_ntoa(ip_dst), layer4_dport FROM DB WHERE (ip_dst IN (SELECT ip_dst FROM DB GROUP BY ip_dst HAVING coun
SELECT sid, cid, timestamp, sig_name, inet_ntoa(ip_src), layer4_sport,
inet_ntoa(ip_dst), layer4_dport
FROM DB
WHERE (ip_dst IN
(SELECT ip_dst FROM DB GROUP BY ip_dst HAVING count(*) > 1)
AND timestamp IN
(SELECT timestamp FROM DB GROUP BY timestamp HAVING count(*) > 1)
AND layer4_dport IN
(SELECT layer4_dport FROM DB GROUP BY layer4_dport HAVING count(*)>1 ))
上面的查询正在尝试查找具有相同时间戳和layer4端口的警报ip端口
如果他们来过不止一次。我希望它清楚
有什么技巧可以提高效率吗?下面的链接可以帮助您
我希望这篇文章能帮助你优化你的查询。我已经格式化了你的查询。。。如果我们把它分解,你似乎在应用一些函数。如果你没有迫切的需求,那就摆脱他们,尤其是当他们看桌子的时候 第二,如果我们查看您的查询,您正在对各种计数进行3次完整的DB扫描,然后在顶层select中进行最小范围扫描
SELECT sid, cid, timestamp, sig_name, inet_ntoa(ip_src), layer4_sport, inet_ntoa(ip_dst), layer4_dport
FROM DB
WHERE ( ip_dst IN ( SELECT ip_dst
FROM DB
GROUP BY ip_dst
HAVING count(*) > 1 )
AND timestamp IN ( SELECT timestamp
FROM DB
GROUP BY timestamp
HAVING count(*) > 1 )
AND layer4_dport IN ( SELECT layer4_dport
FROM DB
GROUP BY layer4_dport
HAVING count(*) > 1 )
)
通过不将子查询链接回主表,您假定IPDST、timestamp和LAYER4DPORT在整个表中都是唯一的,然后尝试查找不太可能出现的3个独立唯一值在同一行中有重复的位置
我猜你想做的事情如下:
SELECT a.sid, a.cid, a.ip_dst, a.timestamp, a.sig_name, a.layer4_sport, a.layer4_dport
FROM DB a
JOIN ( SELECT timestamp, layer4_dport
FROM DB
GROUP BY timestamp, layer4_dport
HAVING count(*) > 1 ) b
ON a.timestamp = b.timestamp
AND a.layer4_dport = b.layer4_dport
根据您的问题,这将查找有超过1个相同时间戳和layer4\u dport组合的所有行
如果要在IPDST级别查找所有重复项,则需要将其添加到子查询中。非常感谢。我的问题与张贴在帖子上的想法或多或少相似。查询工作正常,但我正在寻找一种更有效的方法。@user1247874:实际上不是。正如你从Ben的文章中所看到的,你的问题与我给你的链接中的想法相去甚远。检查上面给出的答案,然后检查Powerlord在链接中给出的答案。通过遵循这些,您应该更接近您所需要的。谢谢。非常感谢你的兴趣。AymenThank you Ben,我已经添加了ip_dst,并且我将inet_ntoa返回到查询中,因为我想打印它的结果。但是,我总是在字段列表中得到错误列'timestamp'是不明确的,查询如下:选择sid、cid、timestamp、sig_名称、inet_ntoaip_src、layer4_sport、inet_ntoaip_dst,layer4_dport FROM DB a JOIN选择时间戳,layer4_dport,ip_dst FROM DB GROUP BY timestamp,layer4_dport,ip_dst在a.timestamp=b.timestamp和a.layer4_dport=b.ip_dst上的计数*>1 b现在工作正常。我刚刚在select语句中添加了一个.timestamp,如下所示:select sid、cid、a.timestamp、sig_name、inet_ntoaip_src、layer4_sport、inet_ntoaa.ip_dst、a.layer4_dport FROM DB a。。。。非常感谢Ben,-AymenAh,是的,对不起@user1247874,我没有明确引用select变量来自哪个表。我已经更新了答案。