2013-07-13 45 views
0

我们需要每24小时运行一次脚本,计算总和&从1个大日志表中删除数据,并更新Main_Table(Innodb)中的数据,该数据有多个select/update查询时间(大约每秒1次)数据锁定阻止查询运行 - MySQL InnoDB

我跑一个地方DB历时约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. 我不确定这是否与我们的问题有关,但我读了 关于“START TRANSACTION ... etc”的一些信息,我认为这可能与 有关......是吗?

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

回答

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; 
    
+0

Thanks eggyal!不过,我宁愿不为Log_Activity.MainID创建一个索引,因为这个表每分钟(有时每秒)获取很多插入,并且这个预期会增长..)其他想法? – SiteAppDev