Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何改进在大型数据库中查找重复条目的MySql查询?_Mysql_Dataset_Acid_Snort - Fatal编程技术网

如何改进在大型数据库中查找重复条目的MySql查询?

如何改进在大型数据库中查找重复条目的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

我必须对大型数据库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 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变量来自哪个表。我已经更新了答案。