在 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 行。
我的问题是:为什么这个连接这么慢,我该如何解决它?我能想到的原因:
- 我更新数据库的方式
- 我不知道我可以在 C# 中使用哪些其他方法或查询来提高性能。
- 我正在使用 C#
- 我应该使用像PHP这样的服务器端语言而不是从另一台计算机连接 吗
- 网速慢
- 我的互联网相对较慢,但我认为这不是主要问题
- 数据库速度慢(我使用的是免费主机)
- 我从一个免费的主机创建了这个数据库。我可以购买付费主机服务。但是我应该吗?
- 其他原因
- 如果您认为我可以使用免费的MySql数据库在C#中执行此操作,并且从另一台计算机的Internet速度较慢,那么您认为主要问题是什么?
这里有几个问题:
SELECT lastonline FROM sql435127.members
将返回没有保证顺序的行,但稍后,您使用索引k
按 id
进行更新。 只有 3 个用户时,行将按顺序返回 1,2,3,但是当您获得数千个成员时,这并不能保证。
您每秒使用从 lastonline
计算的值更新两个字段。您不需要这样做。 每当要使用这些字段时,只需选择lastonline
并计算当前值。 这实际上是许多性能问题的常见解决方案;如果 X 太慢,看看你是否真的需要做 X,而不是试图让它更快。
我想回答你的理由,无论它们是否正确。
1.更新数据库的方式
当然,这可能是原因,因为您正在Tick
事件上更新服务器
2.我正在使用 C#
无论您使用哪种语言,数据库延迟都不是因为使用了语言。
3.网速慢
这真的与您的问题无关。所花费的时间是从服务器端开始的。
4.数据库速度慢(我使用的是免费主机)
无论是付费还是免费,数据库都是相同的。MySql通常很快,因为它是基于文件的,而不是SQL Server。所以你有一个很好的数据库。
5.其他原因
我认为数据库不应该经常更新。但这就是我。
溶液?
好吧,没有明确的原因,但是您可以像使用存储过程一样进行微优化,如果您一遍又一遍地做同样的事情,它们会更快。
使用参数化查询。不要连接字符串。
最后也是最重要的一点:如果您确实需要在Tick
事件中更新数据库,请再考虑一下。如果可能,将其转换为某个按钮的Click
事件