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

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。

 



 

二、查询:

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

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

1、直接查询;

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

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

 



 

2、分页和带子类查询;

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

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

 

 



 

三、批量更新:

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

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

 

 

 

 

posted @ 2021-12-16 22:01  指尖上的艺术  阅读(4467)  评论(0编辑  收藏  举报