我正在尝试使用C#和MySql数据库编写类似于流行的浏览器游戏(ogame,ikariam,tribalwars)的基于文本的游戏。为此,我将有一个服务器更新用户'每秒在数据库中进行帐户,以及访问数据库以获取信息和播放的用户。但是,我对数据库更新的速度存在问题。例如,我编写了以下代码来检查用户的在线状态和活动以及更新数据库。但每次只需3个用户就需要400ms-1000ms,并且随着我添加用户而增加。我会做更多的更新,并会有更多的用户。这是我在我写的管理面板中得到的: http://s27.postimg.org/hbg39icib/panel.png
private void serverRunner_Tick(object sender, EventArgs e)
{
ArrayList lastonline = new ArrayList();
int users = 0, active = 0, onlines = 0;
MySqlCommand getUsers = new MySqlCommand("SELECT lastonline FROM sql435127.members", c);
MySqlDataReader Reader = getUsers.ExecuteReader();
while (Reader.Read())
lastonline.Add(DateTime.Parse(Reader["lastonline"].ToString()));
Reader.Close();
users = lastonline.Count;
int k = 0;
int[] activity= new int[users];
int[] onlinestatus = new int[users];
foreach(DateTime date in lastonline)
{
int value1 = DateTime.Compare(date, DateTime.Now.AddMinutes(-5));
int value2 = DateTime.Compare(date, DateTime.Now.AddDays(-7));
if (value1 <= 0)
onlinestatus[k] = 0;
else
{
onlinestatus[k] = 1;
onlines++;
}
if (value2 <= 0)
activity[k] = 0;
else
{
activity[k] = 1;
active++;
}
k++;
MySqlCommand updateUser = new MySqlCommand("Update sql435127.members SET activity = '" + activity[k-1] + "', online = '"+ onlinestatus[k-1] + "' WHERE id = '" + k + " '", c);
updateUser.ExecuteNonQuery();
}
(这是代码的一部分。我在方法之外声明连接以节省时间,我在这个方法中也有一个计时器)
我应该在50毫秒内更新3000行。相反,我在500毫秒内更新3行。
我的问题是:为什么这种联系如此缓慢,我该如何解决? 我能想到的原因:
答案 0 :(得分:1)
这里有几个问题:
SELECT lastonline FROM sql435127.members
将返回没有保证订单的行,但稍后,您使用索引k
按id
进行更新。只有3个用户,行将按1,2,3的顺序返回,但是如果你有成千上万的成员,则无法保证。
您每秒都会使用lastonline
计算的值更新两个字段。你不需要这样做。只要您想使用这些字段,只需选择lastonline
并计算当前值即可。这实际上是许多性能问题的常见解决方案;如果X太慢,看看你是否真的需要做X,而不是试图让它更快。
答案 1 :(得分:0)
我想回答你的理由是否正确。
当然,这可能是原因,因为您正在Tick
事件上更新服务器
无论您使用何种语言,由于语言的使用,数据库延迟都不会。
这与你的问题无关。所花费的时间来自服务器端。
无论是付费还是免费,数据库都是相同的。 MySql通常很快,因为它是基于文件而不是SQL Server。所以你有一个好的数据库。
我不认为db应该经常更新。但那就是我。
嗯,没有明确的原因,但你可以像使用存储过程那样进行微优化,如果你一遍又一遍地做同样的事情,它们会更快。
使用参数化查询。不要连接字符串。
最后也是最重要的:如果你真的需要更新Tick
事件中的数据库,请再考虑一下。如果可能,请将其转换为某个按钮的Click
事件