1

私は、構造化された方法でフォーマットされた電子メールを受信して​​解析し、情報を MySQL データベースに保存するシステムに取り組んでいます。各電子メールには、特定のイベントが記載されています。ただし、イベントの詳細がディスパッチャによって更新されると新しい電子メールが送信されるため、1 つのイベントで複数の電子メールが生成されることがあります。これは、新しい情報が追加されると、数分間の間に何度も発生する可能性があります。

特定のイベントを説明する最新の行のみを選択するクエリを作成しようとしています。

以下は、テーブルがどのように見えるかの例です。とは同じイベントを参照してEventIDいることに注意してください。イベントは、最近受信したメールに詳細が記載されているだけです。人間は、アドレス、イベント タイプ、および受信時刻をすばやく見て、それらが同じイベントを参照していると推測できます。問題は、これを妥当な精度でクエリに変換するにはどうすればよいかということです。344

EventID    EventReceived        EventAddress        EventType      EventDetails
4          11-15-2012 22:55     1234 Anywhere Ln    Fall           In backyard. Possible fracture.
3          11-15-2012 22:54     1234 Anywhere Ln    Fall           In backyard.
2          11-15-2012 17:04     4321 Freedom Ct     Heart Attack   Short of breath. Took 2 NTG.
1          11-15-2012 13:43     9871 Main St        Traffic Crash  2 vehicles in intersection. Fluid leaking from vehicle.

データベースにクエリを実行するときに受け取りたいのは次のとおりです。

EventID    EventReceived        EventAddress        EventType      EventDetails
4          11-15-2012 22:55     1234 Anywhere Ln    Fall           In backyard. Possible fracture.
2          11-15-2012 17:04     4321 Freedom Ct     Heart Attack   Short of breath. Took 2 NTG.
1          11-15-2012 13:43     9871 Main St        Traffic Crash  2 vehicles in intersection. Fluid leaking from vehicle.

最初に、私はこれを試しました:

SELECT * FROM table_name WHERE (EventID) IN (SELECT MAX(EventID) FROM table_name GROUP BY EventAddress) ORDER BY EventReceived DESC;

少なくとも 2 つの問題がありますが、一般的には機能しているようです。

  • クエリは数百のレコードでも非常に遅い (~15 秒)
  • が同じイベントを見逃していると思いEventAddressますが、イベントは、たとえば数日離れています。これらは明らかに同じイベントではありませんが、グループ化されたアドレス内で最も高いものだけを取得しているため、ロールアップされる可能性がEventIDあります。

そう:

  • クエリの効率を改善するにはどうすればよいですか。
  • 時間要素の重要性をどのように説明できますか? (同じイベントと見なすべきものに任意の時間制限を課すことができます。たとえば、15 分)。

SQL クエリに依存するのではなく、このロジックをアプリケーションに組み込むことをお勧めしますか?

ここまでやってくれて、役に立つアイデアを持っている人に感謝します!

注:参考になるかもしれないと思ってこの質問を見てみましたが、時間がまったく同じではないため、うまくいくかどうかわかりません。

4

2 に答える 2

0

考えられる最適化ソリューションの 1 つは、重複を削除するプロセスを頻繁に実行することです。

例: スクリプトを 10 分ごとに実行して、過去 10 ~ 11 分間のすべてのレコードを調べ、重複を特定して削除します。

スクリプトの実行頻度と実行期間は、システムの要件によって最適に決定できます。

于 2012-11-16T04:45:38.477 に答える
0

次のようなことを試すことができます:

SELECT t1.* 
FROM table_name t1
LEFT JOIN table_name t2 ON t2.EventAddress = t1.EventAddress AND t2.EventReceived > t1.EventReceived 
WHERE t2.EventID IS NULL

現時点では構文をテストする方法はありませんが、アイデアは、より最近の同じイベントに対してテーブルを自己結合し、より最近のエントリがないイベントのみを保持することです。

于 2012-11-16T13:40:57.533 に答える