MySQL "pileup" 导入行时

MySQL "pileup" when importing rows

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

最后一步导致大量查询积压。查看 SHOW PROCESSLIST 我看到一堆 updating-status 查询在复制完成之前一直卡住(这可能需要一分钟)。

但是我确实注意到它并没有堆积连续的查询 ID,许多查询都可以很好地完成。所以它几乎看起来像是一个 "thread" 卡住了什么的。还要注意的是,卡住的更新与正在进行的副本没有任何共同之处(不同 tables 等)

所以:

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

MySQL 线程的命名不准确。例如,如果您是 Java 开发人员,您可能会根据您的 Java 知识对 MySQL 线程做出一些不正确的假设。

出于某种难以从远处诊断的原因,您的复制步骤阻止了某些查询的完成。如果你想知道哪些尝试做

 SHOW FULL PROCESSLIST

并尝试理解结果。

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

  1. 创建一个新的非临时 table,为上午 11 点的更新命名为 stats_11。如果具有该名称的 table 已经存在,请先删除旧的。
  2. 根据需要填充 table。
  3. 添加它需要的索引。有时,如果在您执行操作时索引不存在,填充 table 会更快。
  4. create or replace view stats as select * from stats_11

下一个小时,对 stats_12 做同样的事情。这个想法是让您的 stats 视图几乎总是指向有效的统计数据 table。

这应该会减少您接触统计信息的时间-table 建筑操作。

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

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;

零干扰,因为table real 始终可用并且始终具有完整的行集。 (好的,RENAME 确实需要很少的时间。)

没有视图,没有临时 table,没有复制数据,不需要 24 table 秒。

您可以考虑执行任务 "continually",而不是每小时执行一次。如果 table 变得如此之大以至于每小时的 cron 作业需要一个多小时,这将变得特别有用!