ASP.NET Core 性能最佳实践(三)优化数据访问和I/O操作
优化数据访问和I/O操作
数据交互以及远程服务通常是程序中最慢的部分,高效的读写数据对性能尤其重要。
建议操作:
- 异步方式调用所有数据访问API。
- 不要获取非必须的数据,近返回当前Http 请求需要的数据。
- 在数据过期是可接受的情况下,可以考虑缓存频繁访问的数据(从数据库中读取或远程服务返回的数据)。根据实际应用场景,可以使用内存缓存(MemoryCache)或分布式缓存(DistributedCache)。
- 减少网络往返。也就是说尽量一次请求返回所需数据,避免多次请求。
- 使用Entity Framework Core时,如果只是读取数据,可以用非跟踪查询模式(no-tracking queries),这样可以提升查询性能。
- 使用Linq 查询时,可使用
Where
,.Select
,.Sum
等方法过滤或聚合查询,从而在数据库中进行过滤。 - 一定要注意EF Core在客户端的某些查询解析,可能无效。(某些自定义的匹配条件)详情查看: Client evaluation performance issues.
- 不要在集合上使用映射查询,会导致N+1查询问题。详情查看:Optimization of correlated subqueries.
在高性能EF中提到下面两个提高性能的方法:
使用 DbContext 池
services.AddDbContextPool<BloggingContext>( options => options.UseSqlServer(connectionString)); |
使用已编译的查询(compiled query)
// Create an explicitly compiled query private static Func<CustomerContext, int , Customer> _customerById = EF.CompileQuery((CustomerContext db, int id) => db.Customers .Include(c => c.Address) .Single(c => c.Id == id)); // Use the compiled query by invoking it using ( var db = new CustomerContext()) { var customer = _customerById(db, 147); } |
以上两种方式要在重复评估,性能测试之后再使用,因为已编译的查询在某些情况下可能并不会带来性能提升。
查询性能问题可以通过Application Insights或其他分析工具,分析数据访问耗时来发现。大多数数据库会提供频繁查询的统计信息,可以帮助开发人员进行分析。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了