gpt4 book ai didi

c# - EF Core Mysql 性能

转载 作者:行者123 更新时间:2023-11-29 10:50:30 26 4
gpt4 key购买 nike

我有大约 1 500 000 个实体的 Mysql 数据库。当我尝试使用 EF Core 1.1 和 Mysql.Data.EntityFrameworkCore 7.0.7-m61 执行以下语句时,大约需要 40 分钟才能完成:

var results = db.Posts
.Include(u => u.User)
.GroupBy(g => g.User)
.Select(g => new { Nick = g.Key.Name, Count = g.Count() })
.OrderByDescending(e => e.Count)
.ToList();

另一方面,使用本地 mysql-cli 和下面的语句,大约需要 16 秒才能完成。

SELECT user.Name, count(*) c 
FROM post
JOIN user ON post.UserId = user.Id
GROUP BY user.Name
ORDER BY c DESC

是我做错了什么,还是MySql的EF Core性能太糟糕了?

最佳答案

您的查询正在做不同的事情。 LINQ-to-Entities 查询中的一些问题:

  1. 您调用Include(...),它将为db.Posts中的每个项目急切地加载User
  2. 您可以为每个组中的每条记录调用 Count()。可以将其重写为每组仅对记录进行一次计数。
  3. 最大的问题是您仅使用 User 对象的 Name 属性。您可以仅选择此字段并找到相同的结果。在 EF 中选择、分组和返回 150 万个字符串应该是一个快速的操作。

原文:

var results = 
db.Posts
.Include(u => u.User)
.GroupBy(g => g.User)
.Select(g => new { Nick = g.Key.Name, Count = g.Count() })
.OrderByDescending(e => e.Count)
.ToList();

建议:

var results = 
db.Posts
.Select(x => x.User.Name)
.GroupBy(x => x)
.Select(x => new { Name = x.Key, Count = x.Count() })
.OrderByDescending(x => x.Count)
.ToList();

如果 EF core 对其允许的分组语句类型仍然有限制,您可以在第一个 Select(...) 语句之后调用 ToList

关于c# - EF Core Mysql 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43824343/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com