1

データが変更された場合にのみテーブルにデータを追加する効率的な方法を見つけようとする助けが必要です。

私はLatestResultsである最初のテーブルを持っており、最新の結果のみを保存しています(チーム番号ごとに1)

TeamNumber(Primary) TeamScore TeamWorkUnits RecordDateTime
1 - 500 - 600 - 2012-09-22 08:20:00
2 - 400 - 6 - 2012-09-22 08:20:00
3 - 90 - 15 - 2012-09-22 08:20:00
4 - 1 - 0 - 2012-09-22 08:20:00

HistoricResultsと呼ばれるもう 1 つのテーブルには、将来の統計のために必要になった場合に備えて、非常に結果のコピーが格納されます。

HisotryKey(Auto-Primary) TeamNumber TeamScore TeamWorkUnits RecordDateTime
1 - 1 500 - 600 - 2012-09-22 08:20:00
2 - 2 -400 - 6 - 2012-09-22 08:20:00
3 - 3- 90 - 15 - 2012-09-22 08:20:00
4 - 4 - 1 - 0 - 2012-09-22 08:20:00
5 - 1 490 - 600 - 2012-09-21 08:20:00
6 - 2 -300 - 6 - 2012-09-21 08:20:00
7 - 3- 40 - 15 - 2012-09-21 08:20:00
8 - 4 - 0 - 0 - 2012-09-21 08:20:00

したがって、データ TeamScore または TeamWorkUnits が RecordDateTime までの最後のレコード以降に変更された場合にのみ、最初のテーブルを 2 番目のテーブルにマージしたいと考えています。

つまり、TeamScore と TeamWorkUnits が同じ場合、履歴テーブルに最も古いエントリが保持されます。

可能であれば、速度のためにこれを完全に MySQL 内で行うことをお勧めします。

現在、1 時間あたり約 100,000 レコードをチェックする必要があります

よろしくお願いします。

4

1 に答える 1

1

このアプローチを試すことができます:

insert into HistoricResults 
  (teamNumber, TeamScore, TeamWorkUnits, RecordDateTime)
  select
    lr.teamNumber, 
    lr.TeamScore, 
    lr.TeamWorkUnits,
    NOW()
  from
    LatestResults lr
  where 
    exists (
      select 
        *
      from
        HistoricResults hs
      where
        hs.teamNumber = lr.teamNumber and
        (hs.TeamScore != lr.TeamScore or hs.TeamWorkUnits != lr.TeamWorkUnits)
        and hs.RecordDateTime = (select max(RecordDateTime) 
                                 from HistoricResults hs1 
                                 where hs1.teamNumber = lr.teamNumber)
      order by RecordDateTime desc
    )

これがどのように機能するかは次のとおりです。内のサブクエリexistは、テーブル レコードを持つ、またはテーブル レコードと異なるHistoricResults最新のレコードを検索します。そのようなレコードが見つかった場合、外部は から適切なレコードを選択し、そのようなレコードは最終的に に挿入されます。TeamScoreTeamWorkUnitsLatestResultsselectLatestResultsHistoricResults

于 2012-09-24T16:04:53.090 に答える