快速更新C#中的MySql数据库

时间:2014-04-05 04:44:35

标签: c# mysql performance

我正在尝试使用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行。

我的问题是:为什么这种联系如此缓慢,我该如何解决? 我能想到的原因:

  1. 我更新数据库的方式
    • 我不知道我可以在C#中使用哪些其他方法或查询来提高性能。
  2. 我正在使用C#
    • 我应该使用像PHP这样的服务器端语言而不是从另一台计算机连接
  3. 网速较慢
    • 我的互联网相对较慢,但我认为这不是主要问题
  4. 慢速数据库(我使用免费主机)
    • 我是从免费主机创建的。我可以买付费主机服务。但我应该吗?
  5. 其他原因
    • 如果您认为我可以使用免费的MySql数据库和另一台计算机的慢速互联网在C#中执行此操作,您认为主要问题是什么?

2 个答案:

答案 0 :(得分:1)

这里有几个问题:

SELECT lastonline FROM sql435127.members将返回没有保证订单的行,但稍后,您使用索引kid进行更新。只有3个用户,行将按1,2,3的顺序返回,但是如果你有成千上万的成员,则无法保证。

您每秒都会使用lastonline计算的值更新两个字段。你不需要这样做。只要您想使用这些字段,只需选择lastonline并计算当前值即可。这实际上是许多性能问题的常见解决方案;如果X太慢,看看你是否真的需要做X,而不是试图让它更快。

答案 1 :(得分:0)

我想回答你的理由是否正确。

1.我更新数据库的方式

当然,这可能是原因,因为您正在Tick事件上更新服务器

2.我正在使用C#

无论您使用何种语言,由于语言的使用,数据库延迟都不会。

3.Slow Internet Speed

这与你的问题无关。所花费的时间来自服务器端。

4.Slow Database(我使用免费主机)

无论是付费还是免费,数据库都是相同的。 MySql通常很快,因为它是基于文件而不是SQL Server。所以你有一个好的数据库。

5.其他原因

我不认为db应该经常更新。但那就是我。

解?

嗯,没有明确的原因,但你可以像使用存储过程那样进行微优化,如果你一遍又一遍地做同样的事情,它们会更快。

使用参数化查询。不要连接字符串。

最后也是最重要的:如果你真的需要更新Tick事件中的数据库,请再考虑一下。如果可能,请将其转换为某个按钮的Click事件