Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用C语言快速更新MySql数据库_C#_Mysql_Performance - Fatal编程技术网

C# 用C语言快速更新MySql数据库

C# 用C语言快速更新MySql数据库,c#,mysql,performance,C#,Mysql,Performance,我正在尝试使用C和MySql数据库编写一个基于文本的游戏,类似于流行的浏览器游戏ogame、ikariam、tribalwars。为此,我将有一个服务器每秒更新数据库中用户的帐户,以及访问数据库以获取信息和播放的用户。但是,我对数据库更新的速度有问题。例如,我编写了以下代码来检查用户的联机状态和活动,并更新数据库。但是每次只使用3个用户就需要400毫秒到1000毫秒,并且随着用户的增加而增加。我会做更多的更新,会有更多的用户。这是我在我写的管理面板中得到的: 这是代码的一部分。我在方法外部声明

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

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

我应该在50毫秒内更新3000行,而不是在500毫秒内更新3行

我的问题是:为什么这个连接这么慢,我如何修复它? 原因我可以想:

我更新数据库的方式 我不知道在C中还可以使用哪些方法或查询来提高性能。 我用的是C 我应该使用像PHP这样的服务器端语言,而不是从另一台计算机连接吗 网速慢 我的网速相对较慢,但我不认为这是主要问题 慢速数据库我使用的是免费主机 我从一个免费主机创建了这个数据库。我可以买付费的主机服务。但我应该吗? 其他原因 如果你认为我可以在C语言中使用免费的MySql数据库和另一台计算机的慢速互联网来完成这项工作,那么你认为主要的问题是什么?
我想回答你的理由,不管他们是否正确

1.我更新数据库的方式 当然,这可能是原因,因为您正在更新服务器上的滴答声事件

2.我用的是C 无论您使用哪种语言,数据库延迟都不是因为语言的使用

3.网速慢 这真的与你的问题无关。所花费的时间来自服务器端

4.数据库速度慢我使用的是免费主机 无论是付费还是免费,数据库都是一样的。MySql通常速度很快,因为它是基于文件的,而不是SQL Server。所以你的数据库很好

5.其他原因 我认为数据库不应该经常更新。但那是我

解决方案 嗯,没有明确的原因,但是你可以像使用存储过程一样进行微观优化,如果你反复做同样的事情,它们会更快

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


最后也是最重要的一点:如果您真的需要在Tick事件中更新db,请仔细考虑。如果可能,将其转换为某个按钮的单击事件

这里有几个问题:

从sql435127中选择lastonline。成员将返回没有保证顺序的行,但稍后,您将使用索引k按id更新。只有3个用户时,这些行将按顺序1、2、3返回,但当您获得数千个成员时,这是不保证的


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

不完全是为了回答您的问题,但建议向命令中添加参数,而不是像那样将它们连接到字符串raw中。此外,C不会是性能问题的原因。存储过程比正常查询运行得更快,请尝试使用存储过程,是的,C与这种速度慢无关,因为我在代码中没有看到任何这样的问题,所以延迟实际上是由DB存储过程引起的,您是指存储在数据库中的存储过程吗?这能显著提高性能吗?如果只写实际的更改,那么将状态写入数据库可能是合理的,但是从数据库中读取每个用户的所有内容可能不是这样。缓存至少应该可以显著改善情况。我想了解这些浏览器mmo游戏是如何几乎立即用数千名玩家更新其数据库的,以及这些玩家是如何同时玩的。关于你的答案:我认为滴答声的主要问题是,当代码需要1-2秒处理时,滴答声的间隔变得不那么准确,我不知道还能用什么。此外,我相信这些游戏必须更新他们的数据库,甚至比这更频繁。
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();

        }