2013-05-06 88 views
0

我有200多个条目的数据库,并与一个cronjob我更新数据库每5分钟。所有条目都是唯一的。更新的MySQL查询优化

我的代码:

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+)会发生什么。我认为服务器将会死亡。

是否有任何解决方案(优化或东西...)?

+1

溶液是测量限度。 5K条目/ 5分钟应该适用于任何SQL服务器。 – nothrow 2013-05-06 20:39:23

+0

为什么你不开始删除一些较旧的条目? – 2013-05-06 20:39:30

+0

你从哪里得到要更新的球员名单? – fthiella 2013-05-06 20:51:01

回答

1

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

0

如果ID是你的主(和你提到的唯一键),更新要快,不能进行优化(因为它是一个主键...如果不是,看你是否能增加一个索引)。

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

如果这是你的情况,你应该使用rabbitmq为了排队你的更新查询,以便以更受控制的方式处理它们.. 。

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。