mysql更新查询优化

时间:2013-05-06 20:37:39

标签: mysql optimization

我有一个包含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+)会发生什么。我认为服务器会死掉。

有任何解决方案(优化或其他......)?

3 个答案:

答案 0 :(得分:1)

我认为你不能做太多但是如果cron越来越慢,每10分钟就要执行一次。此外,您可以设置X规则以删除X天旧条目。

答案 1 :(得分:0)

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

可能发生的唯一问题(在我看来)是cronjob重叠,由于更新缓慢:让我们假设你的工作在凌晨1点开始,并且还没有在凌晨1点05分结束......这将意味着你的查询将堆积,创建服务器负载,缓慢的响应时间等...

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

答案 2 :(得分: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。