0

我有一个包含 200 多个条目的数据库,并且使用 cronjob 我每 5 分钟更新一次数据库。所有条目都是唯一的。

我的代码:

for($players as $pl){
   mysql_query("UPDATE rp_players SET state_one = '".$pl['s_o']."', state_two = '".$pl['s_t']."' WHERE id = '".$pl['id']."' ")
   or die(mysql_error());
}

每 5 分钟有 200 多个查询。我不知道如果我的数据库有更多条目(2000...5000+)会发生什么。我认为服务器会死。

有没有解决方案(优化或其他东西......)?

4

3 回答 3

1

我认为您无能为力,但如果 cron 越来越慢,则每 10 分钟执行一次。此外,您可以设置 X 规则以删除 X 天前的条目。

于 2013-05-06T20:49:41.530 回答
0

我会使用 LOAD DATA INFILE 命令将所有要更新的数据加载到临时表中:http: //dev.mysql.com/doc/refman/5.5/en/load-data.html

然后,您可以使用一个查询更新所有内容:

UPDATE FROM rp_players p
INNER JOIN tmp_players t
  ON p.id = t.id
SET p.state_one = t.state_one
  , p.state_two = t.state_two
;

这会更有效率,因为您将通过每次通过 php 循环运行单独的查询来消除服务器的大量往返。

根据数据的来源,您也许可以从这个过程中完全删除 PHP。

于 2013-05-06T21:00:47.277 回答
0

如果 id 是您的主键(并且是您提到的唯一键),则更新应该很快并且无法优化(因为它是主键......如果不是,请查看是否可以添加索引)。

唯一可能发生的问题(在我看来)是 cronjob 重叠,因为更新缓慢:假设您的工作从凌晨 1:00 开始,并没有在凌晨 1:05 完成......这意味着您的查询将堆积,创建服务器负载,响应时间慢等...

如果这是您的情况,您应该使用rabbitmq来对更新查询进行排队,以便以更可控的方式处理它们......

于 2013-05-06T20:50:58.327 回答