0

1 つの大きなログ テーブルからデータの合計と平均を計算し、常に多くの選択/更新クエリを持つ Main_Table (Innodb) のデータを更新するスクリプトを 24 時間ごとに実行する必要があります (毎秒約 1 回)。

約 10 分かかったローカル DB でテスト クエリを実行しました。

Update Main_Table Set Steps = (Select count(*) From Log_Activity Where Log_Activity.MainID = Main_Table.ID)

そして、これは Main_Table のすべての行を更新するため、テーブルのロッキングのためにすべてがライブ プロジェクトで動かなくなると思います - これが再び適切に機能するようにするには、クエリのプロセスを強制終了する必要がありました - データは更新されませんでした。

私はいくつかの掘り下げを行い、次の3つのオプションを検討しています。

  1. 一時テーブル内のすべてのデータを更新してから、何らかの方法で Main_Table にマージします。
  2. 1 つの MySql クエリではなく、php ループでスクリプトを実行します (時間がかかりますが、一度に 1 行ずつ更新します)。
  3. これが私たちの問題に関係しているかどうかはわかりませんが、「START TRANSACTION... etc」について何か読んだことがあります。

誰かがこれに光を当てて私たちを助けてくれることを願っています. ありがとう

4

1 に答える 1

0
  1. Log_Activity.MainIDまだ存在しない場合は、 にインデックスを作成します。

    ALTER TABLE Log_Activity ADD INDEX (MainID);
    
  2. Main_Table.IDまだ存在しない場合は、 にインデックスを作成します。

    ALTER TABLE Main_Table ADD INDEX (ID);
    
  3. 相関サブクエリではなく、結合を使用するようにクエリを書き直します。

    UPDATE Main_Table JOIN (
      SELECT   MainID ID, COUNT(*) c
      FROM     Log_Activity
      GROUP BY MainID
    ) t USING (ID)
    SET Main_Table.Steps = t.c;
    
于 2013-07-13T10:41:21.753 に答える