ORM说明:
- EFCore 6.0.0(Microsoft.EntityFrameworkCore、Pomelo.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是直接值追加的,批量删除也不做测试了,意义不大