MySQL“;“连环相撞”;导入行时
我每小时运行以下cron进程来更新全球游戏统计数据:MySQL“;“连环相撞”;导入行时,mysql,cron,database-performance,Mysql,Cron,Database Performance,我每小时运行以下cron进程来更新全球游戏统计数据: 创建临时表 对于每个统计,在临时表中插入行(统计键、用户、分数、排名) 截断主统计表 将数据从临时表复制到主表 最后一步导致大量查询积压。查看SHOW PROCESSLIST我看到一堆更新-状态查询,这些查询一直被卡住,直到复制完成(可能需要一分钟) 但是我注意到,它不像连续的查询ID那样堆积如山,许多查询都可以很好地完成。所以它看起来像是一根“线”卡住了或是什么的。另外值得注意的是,卡住的更新与正在进行的复制没有任何共同之处(不同的表等
- 创建临时表
- 对于每个统计,在临时表中插入行(统计键、用户、分数、排名)
- 截断主统计表
- 将数据从临时表复制到主表
SHOW PROCESSLIST
我看到一堆更新
-状态查询,这些查询一直被卡住,直到复制完成(可能需要一分钟)
但是我注意到,它不像连续的查询ID那样堆积如山,许多查询都可以很好地完成。所以它看起来像是一根“线”卡住了或是什么的。另外值得注意的是,卡住的更新与正在进行的复制没有任何共同之处(不同的表等)
因此:
- 我可以让cron在一个专用的“线程”上连接到MySQL,这样它的磁盘活动(或其他任何活动)就不会锁定其他更新,或者
- 我是否误解了正在发生的事情,如果是,我如何才能找出实际情况
如果您需要更多信息,请告诉我。MySQL线程的名称并不完美。例如,如果您是Java开发人员,您可能会根据自己的Java知识对MySQL线程做出一些不真实的假设 由于某种原因,很难从远处进行诊断,您的复制步骤会阻止某些查询的完成。如果你想知道哪些人会尝试
SHOW FULL PROCESSLIST
试着理解结果
同时,您可能会考虑稍微不同的方法来刷新这些小时统计数据。
stats\u 11
。如果具有该名称的表已存在,请先删除旧表创建或替换视图统计信息作为select*from stats_11
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分钟之前。之后: