Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
数据锁定阻止查询运行-MySQL InnoDB_Mysql_Innodb_Rowlocking_Table Locking - Fatal编程技术网

数据锁定阻止查询运行-MySQL InnoDB

数据锁定阻止查询运行-MySQL InnoDB,mysql,innodb,rowlocking,table-locking,Mysql,Innodb,Rowlocking,Table Locking,我们需要每24小时运行一个脚本,计算一个大日志表中的数据总和和平均值,并更新主表(Innodb)中的数据,该表始终有许多选择/更新查询(大约每秒1个) 我在本地数据库上运行了一个测试查询,大约花了10分钟: Update Main_Table Set Steps = (Select count(*) From Log_Activity Where Log_Activity.MainID = Main_Table.ID) 因为这会更新主表中的所有行,所以所有内容都会在live项目中被卡住,因为表

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

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

Update Main_Table Set Steps = (Select count(*) From Log_Activity Where Log_Activity.MainID = Main_Table.ID)
因为这会更新主表中的所有行,所以所有内容都会在live项目中被卡住,因为表被偷懒,我猜-我必须停止查询过程,以便再次正常工作-没有更新任何数据

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

  • 更新临时表中的所有数据,然后以某种方式合并到主表中
  • 在php循环中运行脚本,而不是在1个MySql查询中运行脚本(需要花费很多时间) 更多时间,但一次更新一行)
  • 我不确定这是否与我们的问题有关,但我读到 关于“启动交易…等”的事情,我想这可能 有关联。。。是吗
  • 希望有人能对此有所启发并帮助我们。 谢谢

  • Log\u Activity.MainID
    上创建索引,如果还不存在索引:

    ALTER TABLE Log_Activity ADD INDEX (MainID);
    
    ALTER TABLE Main_Table ADD INDEX (ID);
    
  • Main_Table.ID
    上创建索引,如果索引不存在:

    ALTER TABLE Log_Activity ADD INDEX (MainID);
    
    ALTER TABLE Main_Table ADD INDEX (ID);
    
  • 重写查询以使用联接,而不是相关子查询:

    UPDATE Main_Table JOIN (
      SELECT   MainID ID, COUNT(*) c
      FROM     Log_Activity
      GROUP BY MainID
    ) t USING (ID)
    SET Main_Table.Steps = t.c;
    

  • 谢谢你!但是,我不希望为Log_Activity.MainID创建索引,因为此表每分钟(有时每秒)会有许多插入,并且预计插入量会增加…)还有其他想法吗?