Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.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“;“连环相撞”;导入行时_Mysql_Cron_Database Performance - Fatal编程技术网

MySQL“;“连环相撞”;导入行时

MySQL“;“连环相撞”;导入行时,mysql,cron,database-performance,Mysql,Cron,Database Performance,我每小时运行以下cron进程来更新全球游戏统计数据: 创建临时表 对于每个统计,在临时表中插入行(统计键、用户、分数、排名) 截断主统计表 将数据从临时表复制到主表 最后一步导致大量查询积压。查看SHOW PROCESSLIST我看到一堆更新-状态查询,这些查询一直被卡住,直到复制完成(可能需要一分钟) 但是我注意到,它不像连续的查询ID那样堆积如山,许多查询都可以很好地完成。所以它看起来像是一根“线”卡住了或是什么的。另外值得注意的是,卡住的更新与正在进行的复制没有任何共同之处(不同的表等

我每小时运行以下cron进程来更新全球游戏统计数据:

  • 创建临时表
  • 对于每个统计,在临时表中插入行(统计键、用户、分数、排名)
  • 截断主统计表
  • 将数据从临时表复制到主表
最后一步导致大量查询积压。查看
SHOW PROCESSLIST
我看到一堆
更新
-状态查询,这些查询一直被卡住,直到复制完成(可能需要一分钟)

但是我注意到,它不像连续的查询ID那样堆积如山,许多查询都可以很好地完成。所以它看起来像是一根“线”卡住了或是什么的。另外值得注意的是,卡住的更新与正在进行的复制没有任何共同之处(不同的表等)

因此:

  • 我可以让cron在一个专用的“线程”上连接到MySQL,这样它的磁盘活动(或其他任何活动)就不会锁定其他更新,或者
  • 我是否误解了正在发生的事情,如果是,我如何才能找出实际情况

如果您需要更多信息,请告诉我。

MySQL线程的名称并不完美。例如,如果您是Java开发人员,您可能会根据自己的Java知识对MySQL线程做出一些不真实的假设

由于某种原因,很难从远处进行诊断,您的复制步骤会阻止某些查询的完成。如果你想知道哪些人会尝试

 SHOW FULL PROCESSLIST
试着理解结果

同时,您可能会考虑稍微不同的方法来刷新这些小时统计数据。

  • 为11am更新创建一个新的非临时表,称之为类似于
    stats\u 11
    。如果具有该名称的表已存在,请先删除旧表
  • 根据需要填充该表
  • 添加所需的索引。有时,如果索引不在适当的位置,填充表的速度会更快
  • 创建或替换视图统计信息作为select*from stats_11
  • 下一个小时,对统计数据12执行同样的操作。这个想法是让你的
    stats
    视图几乎总是指向一个有效的stats表


    这将减少您在统计表构建操作中的暴露时间。

    如果任务是完全重建表,这是最好的:

    CREATE TABLE new_stats LIKE stats;
    ... fill up new_stats by whatever means ...
    RENAME TABLE stats TO old_stats, new_stats TO stats;
    DROP TABLE old_stats;
    
    由于表
    real
    始终可用且始终具有一组完整的行,因此没有干扰。(好的,
    RENAME
    只需很少的时间。)

    无视图,无临时表,无需复制数据,无需24个表


    你可以考虑不断地做这项工作,而不是每小时做一次。如果表变得如此之大,以至于每小时的cron作业需要超过一个小时,这将变得特别有益

    卡住的进程说他们在等待什么?这很有趣。因此,为给定的小时构建一个表,并将视图更新到其中。。。如何使用引用用户ID等的外键?在:1分钟之前。之后: