MySQL "pileup" 导入行时
MySQL "pileup" when importing rows
我有以下 cron 进程 运行 每小时更新一次全球游戏统计数据:
- 创建临时文件table
- 对于每个统计数据,将行插入临时 table(统计键、用户、得分、排名)
- 截断主要统计数据table
- 将数据从临时 table 复制到主要 table
最后一步导致大量查询积压。查看 SHOW PROCESSLIST
我看到一堆 updating
-status 查询在复制完成之前一直卡住(这可能需要一分钟)。
但是我确实注意到它并没有堆积连续的查询 ID,许多查询都可以很好地完成。所以它几乎看起来像是一个 "thread" 卡住了什么的。还要注意的是,卡住的更新与正在进行的副本没有任何共同之处(不同 tables 等)
所以:
- 我能否让 cron 连接到专用 "thread" 上的 MySQL,这样它的磁盘 activity(或其他任何东西)就不会锁定其他更新,或者
- 我是否误解了正在发生的事情,如果是的话,我怎样才能找出实际情况?
如果您需要更多信息,请告诉我。
MySQL 线程的命名不准确。例如,如果您是 Java 开发人员,您可能会根据您的 Java 知识对 MySQL 线程做出一些不正确的假设。
出于某种难以从远处诊断的原因,您的复制步骤阻止了某些查询的完成。如果你想知道哪些尝试做
SHOW FULL PROCESSLIST
并尝试理解结果。
与此同时,您可能会考虑使用稍微不同的方法来刷新这些每小时统计数据。
- 创建一个新的非临时 table,为上午 11 点的更新命名为
stats_11
。如果具有该名称的 table 已经存在,请先删除旧的。
- 根据需要填充 table。
- 添加它需要的索引。有时,如果在您执行操作时索引不存在,填充 table 会更快。
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 作业需要一个多小时,这将变得特别有用!
我有以下 cron 进程 运行 每小时更新一次全球游戏统计数据:
- 创建临时文件table
- 对于每个统计数据,将行插入临时 table(统计键、用户、得分、排名)
- 截断主要统计数据table
- 将数据从临时 table 复制到主要 table
最后一步导致大量查询积压。查看 SHOW PROCESSLIST
我看到一堆 updating
-status 查询在复制完成之前一直卡住(这可能需要一分钟)。
但是我确实注意到它并没有堆积连续的查询 ID,许多查询都可以很好地完成。所以它几乎看起来像是一个 "thread" 卡住了什么的。还要注意的是,卡住的更新与正在进行的副本没有任何共同之处(不同 tables 等)
所以:
- 我能否让 cron 连接到专用 "thread" 上的 MySQL,这样它的磁盘 activity(或其他任何东西)就不会锁定其他更新,或者
- 我是否误解了正在发生的事情,如果是的话,我怎样才能找出实际情况?
如果您需要更多信息,请告诉我。
MySQL 线程的命名不准确。例如,如果您是 Java 开发人员,您可能会根据您的 Java 知识对 MySQL 线程做出一些不正确的假设。
出于某种难以从远处诊断的原因,您的复制步骤阻止了某些查询的完成。如果你想知道哪些尝试做
SHOW FULL PROCESSLIST
并尝试理解结果。
与此同时,您可能会考虑使用稍微不同的方法来刷新这些每小时统计数据。
- 创建一个新的非临时 table,为上午 11 点的更新命名为
stats_11
。如果具有该名称的 table 已经存在,请先删除旧的。 - 根据需要填充 table。
- 添加它需要的索引。有时,如果在您执行操作时索引不存在,填充 table 会更快。
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 作业需要一个多小时,这将变得特别有用!