我正在开发这款名为“Fortress”的游戏,地址为 http://www.joemajewski.com/fortress .无论如何,它是那些基于浏览器的角色扮演游戏之一,玩家可以在其中建立一支军队并升级他们的统计数据以在排行榜上获得更高的排名。
每 30 分钟就会执行一个 cron 作业,这会进行一些更新。它循环遍历游戏的每个玩家(随着越来越多的人加入,随着时间的推移自然会继续上升),并更新某些统计数据。它给每个人 1 个额外回合,根据他们的收入、食物、木头、铜、铁等给他们金币......,加上它更新他们的排名。
我知道这些都是胡言乱语,但重点是每个玩家都会有自己的更新查询。我为只有三个成员的脚本计时:
注释掉更新的 mysql_query() 函数的执行时间:~ 3.5 毫秒
mysql_query() 函数正常工作的执行时间:~ 14 毫秒
很明显,一旦游戏拥有 100 多个注册成员(member),更新查询将导致我的 cron 作业变得非常慢。我希望在游戏发布后的两周内有 100 名活跃玩家,但许多玩家创建了多个帐户,所以我预计几周后至少会有 200 名成员。有了 200 个更新查询,加上对成员进行排序和计算排名的额外时间,运行 cron 作业可能需要 2 秒多的时间。
我想问你的问题。有没有更快的方法来做这样的事情?我尝试分别在循环前后添加“START TRANSACTION”和“COMMIT”查询,但很难仅用 3 个成员来衡量速度。交易会使脚本变得更好还是更糟? 还有其他办法吗?任何帮助将不胜感激。
非常感谢您抽出时间聆听我的请求。
最佳答案
根据问题中的有限细节,听起来您可以在一个或几个查询中完成所有播放器更新,而不是单独遍历所有播放器。
考虑添加回合,并根据公式更新他们的金币,所有这些都在一个影响整个表的查询中完成。
即作为基本的过度简化:
update Players set turns = turns + 1,
gold = (gold + (income * 100) + (wood * 25) + (copper * 25))
这有帮助吗?
关于排名,你现在是怎么计算的?
关于php - 运行 100 多个 MySQL 更新查询。优化提示请:),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3373392/