.NET 6下,MySQL第三方ORM性能测试,EFCore、SqlSugar、Zack、Z.EntityFramework

摘要:
Zack和SqlSugar.Fastest都需要开启MySQL的local_infile=ON,因此性能达到极限。批量插入前,先执行以下代码,否则插入10万条会报错:setglobalmax_allowed_packet=2*1024*1024*10SqlSugar需要注意坑还是有的,例如这个版本的Fastest的bool类型就强制为1。

ORM说明:

  • EFCore 6.0.0(Microsoft.EntityFrameworkCorePomelo.EntityFrameworkCore.MySql(微软原生,性能有惊喜,请看下文)
  • SqlSugarCore 5.0.4.7(国内主流第三方ORM)
  • Z.EntityFramework.Extensions.EFCore 6.13.2 (需收费,增加Bulk操作)
  • Z.EntityFramework.Plus.EFCore 6.13.2(免费,没有Bulk操作)
  • Zack.EFCore.Batch.MySQL.Pomelo_NET6 6.0.4(国内主流第三方ORM)
  • EFCore.BulkExtensions(不支持MySQL)
  • Dapper(不参与测试,因为查询性能跟SqlSugar差不多,但是其他功能集成度没SqlSugar高,且编写原生sql对于项目的可读性太差)

版本说明:

  • .NET 6控制台
  • MySQL社区版:8.0.27
  • Windows 11
  • 第三方包版本:
  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.0" />
    <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="6.0.0" />
    <PackageReference Include="SqlSugarCore" Version="5.0.4.7" />
    <PackageReference Include="Z.EntityFramework.Extensions.EFCore" Version="6.13.2" />
    <PackageReference Include="Z.EntityFramework.Plus.EFCore" Version="6.13.2" />
    <PackageReference Include="Zack.EFCore.Batch.MySQL.Pomelo_NET6" Version="6.0.4" />
  </ItemGroup>

一、批量插入:

耗时:Zack < SqlSugar.Fastest < Z.EF.Ext < SqlSugar < EFCore

说明:EFCore慢是因为插入动作是逐条执行的,且会返回主键ID,日常少数量的插入大可以放心用EFCore。

Zack和SqlSugar.Fastest都需要开启MySQL的local_infile=ON,因此性能达到极限。但是除了爬虫、数据库迁移一般用不上这么大批量的插入,因此SqlSugar的常规批量插入足以解决问题。

批量插入前,先执行以下代码,否则插入10万条会报错:set global max_allowed_packet = 2*1024*1024*10

SqlSugar需要注意坑还是有的,例如这个版本的Fastest的bool类型就强制为1。

.NET 6下,MySQL第三方ORM性能测试,EFCore、SqlSugar、Zack、Z.EntityFramework第1张

.NET 6下,MySQL第三方ORM性能测试,EFCore、SqlSugar、Zack、Z.EntityFramework第2张



二、查询:

相比于批量插入、更新和批量删除,更常用的应该是查询功能,查询目前只测试EFCore和SqlSugar

测试时,用户表数据300万。

1、直接查询;

少量数据来说,时间差距微不足道,意想不到的是,EFCore(不跟踪)的效率比SqlSugar还要高

不过SqlSugar的优势在于查出来后,可以通过Updateable直接更新实体

.NET 6下,MySQL第三方ORM性能测试,EFCore、SqlSugar、Zack、Z.EntityFramework第3张



2、分页和带子类查询;

带条件的分页查询是最常见的业务,对于非常复杂,多条件的查询语句,按照我个人经验,如果无法实现查询总行数和查询数据一起执行,那么查询总数前一定不能Order和Select,否则会非常影响效率;

值得注意的是,SqlSugar的官网说分页查询是一次完成的,但是输出查询语句发现还是分两次:

.NET 6下,MySQL第三方ORM性能测试,EFCore、SqlSugar、Zack、Z.EntityFramework第4张

.NET 6下,MySQL第三方ORM性能测试,EFCore、SqlSugar、Zack、Z.EntityFramework第5张



三、批量更新:

批量更新和删除没什么好说的,毕竟生成的都是直接update的语句,喜欢用哪个就哪个

需要注意的是,Zack和SqlSugar是直接值追加的,批量删除也不做测试了,意义不大

.NET 6下,MySQL第三方ORM性能测试,EFCore、SqlSugar、Zack、Z.EntityFramework第6张

免责声明:文章转载自《.NET 6下,MySQL第三方ORM性能测试,EFCore、SqlSugar、Zack、Z.EntityFramework》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇双击dataGridView一行数据,打开一个另一个窗体,并把双击行的数据展示出来内核移植和文件系统制作(4):UBIFS根文件系统制作总结下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

jsp语法与标签

语法: <% 多行java代码 %> 在一个JSP页面中可以有多个脚本片断,在两个或多个脚本片断之间可以嵌入文本、HTML标记和其他JSP元素。 举例: <% int x = 10; out.println(x); %> <p>这是JSP页面文本</p> <...

【转帖】C++编译原理 资料

转自:http://blog.csdn.net/shiwenbin333/article/details/5157797 首先是预编译,这一步可以粗略的认为只做了一件事情,那就是“宏展开”,也就是对那些#***的命令的一种展开。       例如define MAX 1000就是建立起MAX和1000之间的对等关系,好在编译阶段进行替换。       例如...

ORM框架:Entity Framework

ORM框架:Entity Framework 1.Entity Framework的概念 什么是ORM 对象-关系映射(Object/Relational Mapping,简称ORM),用来把对象模型表示的对象映射到基于SQL的关系模型数据库结构中去。这样在具体的操作实体对象的时候,就不需要再去和复杂的SQL语句打交道,只需简单的操作实体对象的属性和方法。...

django面试题必问

1、谈谈你对http协议的认识。 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。HTTP是一个应用层协议,由请...

Linux 错误码对照表

errno 在 <errno.h> 中定义,错误 Exx 的宏定义在 /usr/include/asm-generic 文件夹下面的 errno-base.h 和 errno.h,分别定义了 1-34 、35-132 的错误定义。 strerror() 函数依据 errno 值返回错误描述字符串,下面程序打印对照表: #include <...

SSI简介 与 nginx开启SSI

Server Side Include : 服务器端嵌入 原理 : 将内容发送到浏览器之前,可以使用“服务器端包含 (SSI)”指令将文本、图形或应用程序信息包含到网页中。因为包含 SSI 指令的文件要求特殊处理,所以必须为所有 SSI 文件赋予 SSI文件扩展名。默认扩展名是 .stm、.shtm 和 .shtml 主要有以下几种用用途: 1、显示服务器...