0

重複するエントリを見つけるには、大規模なデータベース(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 ))

上記のクエリは、同じアラートip_dstを検索しようとし、アラート timestamplayer4_dport 複数回発生した場合に発生します。私はそれが明確であることを願っています!

それを効率的にするためのヒントやコツはありますか?

4

2 に答える 2

1

以下のリンクが役に立ちます。

MySQLで重複レコードを検索する

この投稿がクエリの最適化に役立つことを願っています。

于 2012-03-04T09:14:01.010 に答える
1

クエリをフォーマットしました...分解すると、いくつかの関数を適用しているようですinet_ntoa。差し迫った必要がない場合は、それらを取り除きます(特に、テーブルを見る場合)。

次に、クエリを見るとDB、さまざまなカウントに対して3回のフルスキャンを実行しており、少なくとも最上位の範囲で範囲スキャンを選択しています。

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

サブクエリをメインテーブルにリンクしないことにより、、はテーブル全体でそれぞれ一意であると想定しip_dst、 3つの独立して一意の値が発生する可能性が低い場所で同じ行に重複がある場所を見つけようとしています。timestamplayer4_dport

あなたがやりたいことは次のようなものだと思います。

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つ以上の同一timestamplayer4_dport組み合わせがあるすべての行が見つかります。

レベルですべての重複を検索する場合は、ip_dstこれをサブクエリに追加する必要があります。

于 2012-03-04T09:46:06.100 に答える