c# - Insert 的 MySQL C# 性能

标签 c# mysql entity-framework

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

当用户完成工作后,应用程序将日志推送到数据库(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/

相关文章:

c# - Entity Framework : "The relationship between the two objects cannot be defined because they are attached to different ObjectContext objects."

php - 我可以在 PHP 中混合使用 MySQL API 吗?

php - 创建没有多个 SQL 查询的 JSON 对象 (PHP)

c# - 加载后如何使用 POCO 和 DbContext 初始化 Entity Framework 中的对象?

c# - 如何正确地对存储库进行单元测试 CRUD 操作?

c# - C# 编译器如何区分抽象方法的具体子类实现和抽象基类中的重载?

c# - 如何识别标记为级联删除的关联

c# - 使用 AutoMapper 映射 ViewModel/partials

mysql - 在MySQL中加载数据的函数

c# - 最小起订量和 Entity Framework