首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正在运行100+ MySQL更新查询。优化提示请:)

问正在运行100+ MySQL更新查询。优化提示请:)
EN

Stack Overflow用户
提问于 2010-07-31 00:18:07
回答 3查看 1.5K关注 0票数 0

我正在开发这款游戏,名为“堡垒”,位于http://www.joemajewski.com/fortress。无论如何,这是一款基于浏览器的角色扮演游戏,玩家可以建立一支军队,并升级自己的统计数据,以在排行榜上获得较高的排名。

每隔30分钟就会执行一次cron作业,这会进行一些更新。它循环通过游戏的每个玩家(随着时间的推移,随着更多的人加入,它将继续自然地上升),并更新某些统计数据。它给每个人一个额外的回合,根据他们的收入,食物,木材,铜,铁,等等,给他们黄金,再加上它更新他们的排名。

我知道这些都是胡说八道,但重点是每个玩家都会有自己的更新查询。我对脚本进行了计时,只有三个成员:

使用mysql_query()函数注释掉更新的执行时间:约3.5毫秒

mysql_query()函数正常工作时的执行时间:~ 14毫秒

很明显,一旦游戏有了100+注册会员,更新查询就会导致我的cron作业变得非常慢。我希望在游戏发布后的两周内有100名活跃玩家,但许多玩家会创建多个帐户,所以我希望在几周后至少有200名成员。对于200个更新查询,加上对成员进行排序和计算排名的额外时间,运行cron作业可能需要2秒以上的时间。

我要问你的是。有没有更快的方法来做这样的事情?我尝试在循环之前和之后分别添加"START TRANSACTION“和"COMMIT”查询,但只有3个成员很难衡量速度。事务会让脚本变得更好还是更糟?有没有别的办法来解决这个问题?任何帮助都将不胜感激。

非常感谢您抽出时间来听我的请求。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-07-31 00:23:35

根据问题中的有限细节,听起来您可以在一个查询或几个查询中完成所有播放器更新,而不是逐个循环所有这些更新。

考虑添加转数,并基于公式更新它们的黄金,所有这些都在一个影响整个表的查询中完成。

例如,作为一种基本的过于简单化:

代码语言:javascript
复制
update Players set turns = turns + 1,
                   gold  = (gold + (income * 100) + (wood * 25) + (copper * 25))

这有帮助吗?

至于排名,你现在是怎么计算的?

票数 4
EN

Stack Overflow用户

发布于 2010-07-31 00:30:43

我的建议是创建一个测试环境。然后用数千行用户数据填充该测试环境。对于要放入多少数据的想法,我使用((What You Expect) + (What You Hope For)) * 2的经验法则。因此,如果你期望100个用户,并希望(一个现实的希望)获得5000个用户,你应该测试至少10200个用户……

因此,创建大型数据库,并尝试尽可能现实,但不要在这上面花费太多的精力。一旦你在那里,尝试你的查询一次一个。对每一个进行优化。然后构建一个简单的PHP脚本,在不同的延迟(query1, sleep 50ms, query2, sleep 100ms, query3, query4, sleep 100ms, etc)上执行许多查询。然后使用像ab (Apache Bench)这样的工具并发地执行该脚本并查找数据库中的问题(记住,这里的任务是给数据库施加压力,所以如果它没有压力,就继续推,直到它有压力为止)。

票数 1
EN

Stack Overflow用户

发布于 2010-07-31 00:38:10

你做错了。

每当有人访问用户资源数据时,计算资源量。当没有人访问这些数据时,您不需要计算这些数据。

存储上次计算数据的时间(lt)。

现在的资源量是: r2=r+dr*( now -lt),其中

dr -现在的资源更改时间-现在的时间-上次保存到数据库的时间。R-存储在数据库中的资源量r2 -当前资源量

你甚至不需要每次都更新表,只需从数据库中读取r,dr,lt,立即计算r2即可。

这样做,您将获得实时数量的资源,您没有玉米工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3373392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档