gpt4 book ai didi

c# - Insert 的 MySQL C# 性能

转载 作者:行者123 更新时间:2023-11-29 00:11:52 24 4
gpt4 key购买 nike

我正在开发一个应用程序,它在启动时检查数据库(更新新数据),并在工作完成时(关闭/注销时)将性能日志推送到数据库。用户自己没有更改任何数据,他们只是生成日志(钱来自他们对数据的使用;)

当用户完成工作后,应用程序将日志推送到数据库(MySQL 数据库),我不想不断推送数据,因为预计连接会断开并在工作日离线(移动设备)工作),在线时间越少越好。这意味着应用程序也必须能够在离线模式下工作。

单个用户推送的日志一般在2000条左右,每条记录包含70字节左右的数据。高峰时间大约有 100 个用户(在不久的将来可能会增加到 300 个),这使得每天大约有 200.000 条日志记录被推送到 MySQL 数据库。因为用户在同一时间工作,所以会出现高峰时段。最坏的情况是同时记录 200.000 个 70 个字节(~14 mb 的数据)。

我使用的数据库是MySQL数据库,选择这个主要是因为:

  • 它是免费的(出售参数)
  • 我可以在线寻求帮助
  • 这是一个标准数据库,意味着其他 IT 部门很可能已经知道它

我正在使用以下语言开发应用程序:C# .Net 4.5

我尝试过使用 EntityFramework,这很容易上手,但在性能上有点失败。当我在我的开发机器上运行程序 + 服务器时,单个用户的 2000 个日志(插入)大约需要 7 秒。而7秒是 Not Acceptable (而且当200个用户同时进行时,它可能会急剧增加)正如我所读到的那样,EntityFramework 似乎将每个插入作为单个 SQL 命令,并且一次采用一个 SQL 命令。

所以我尝试使用 MySQL Connector/Net。但我不想像 EntityFramework 那样做,而是将每个插入作为单个命令进行。于是我的目光转向了MySqlBulkLoader。但是它只想接受一个文件,而不是原始数据,有没有办法在程序中加载带有数据的MySqlBulkLoader,我宁愿不将数据保存到硬盘以便能够将数据发送到数据库,感觉就像不必要的弯路

所以我的问题是(不再讲故事;)

  • 我可以在不在磁盘上创建文件的情况下使用内存中的数据加载 MySqlBulkLoader 吗?
  • 我应该使用 MySQL Connector/Net 还是有其他方法(比如原始 SQL 语句)?

编辑:答案是

将 MySQL Connector/Net 与原始 SQL 命令一起使用,将插入作为批量插入 LIKE THIS .

最佳答案

假设记录是 2000000 而不是 2000。EF 与其他 ORM 一样,旨在简化正常事务工作负载的编码,而不是性能关键型密集型工作负载。

答案很简单:如果您重构代码以通过单个连接将所有项目插入单个数据库事务中后不满意(因为 7 秒对我来说也太长了,除非您每次都关闭/打开连接),您应该在该部分代码中执行原始 SQL 语句,并在其他代码中继续使用 EF。

没有别的办法。正确的批处理是通过普通的旧 SQL。

而MysqlBulkLoader只是为了文件系统操作而制作的,虽然文件可以是一个临时文件

关于c# - Insert 的 MySQL C# 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24697612/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com