0

我们需要每 24 小时运行一次脚本,计算来自 1 个大日志表的数据的总和和平均值,并更新 Main_Table(Innodb)中的数据,该表一直有许多选择/更新查询(大约每秒 1 次)

我在本地数据库上运行了大约 10 分钟的测试查询:

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

并且因为这会更新 Main_Table 中的所有行,所以我猜由于表 loacking,所有内容都会卡在实时项目中 - 我必须终止查询过程才能再次开始正常工作 - 没有更新任何数据。

我做了一些挖掘,我正在考虑以下 3 个选项:

  1. 更新临时表中的所有数据,然后以某种方式合并到 Main_Table 中。
  2. 在 php 循环中运行脚本,而不是 1 个 MySql 查询(将花费更多时间,但一次更新 1 行)。
  3. 我不确定这是否与我们的问题有关,但我读到了一些关于“开始交易......等”的东西,我认为这可能是相关的......是吗?

希望有人能对此有所了解并帮助我们。谢谢

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 回答