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

本文关键字:更新 MySql 数据库 | 更新日期: 2023-09-27 17:56:51

我正在尝试使用C#和MySql数据库编写一个类似于流行浏览器游戏(ogame,ikariam,tribalwars)的基于文本的游戏。为此,我将让服务器每秒更新数据库中的用户帐户,以及访问数据库以获取信息和播放的用户。但是,我对数据库的更新速度有问题。例如,我编写了以下代码来检查用户的联机状态和活动,并更新数据库。但是每次只有 400 个用户需要 1000ms-3 毫秒,并且随着我添加用户而增加。我会做更多的更新,并且会有更多的用户。这是我在我写的管理面板中得到的: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();
        }

(这是代码的一部分。我在方法外部声明连接以节省时间,并且在此方法中我还有一个计时器)

我应该在大约 3000 毫秒内更新 50 行。相反,我在 3 毫秒内更新 500 行。

我的问题是:为什么这个连接这么慢,我该如何解决它?我能想到的原因:

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

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

这里有几个问题:

SELECT lastonline FROM sql435127.members将返回没有保证顺序的行,但稍后,您使用索引kid 进行更新。 只有 3 个用户时,行将按顺序返回 1,2,3,但是当您获得数千个成员时,这并不能保证。

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

我想回答你的理由,无论它们是否正确。

1.更新数据库的方式

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

2.我正在使用 C#

无论您使用哪种语言,数据库延迟都不是因为使用了语言。

3.网速慢

这真的与您的问题无关。所花费的时间是从服务器端开始的。

4.数据库速度慢(我使用的是免费主机)

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

5.其他原因

我认为数据库不应该经常更新。但这就是我。

溶液?

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

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

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