[英]EF Core Mysql performance
我的Mysql数据库有约1500万个实体。 当我尝试使用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和below语句,大约需要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到实体查询中的一些问题:
Include(...)
,它将急切地为db.Posts
每个项目加载User
。 Count()
。 可以重写此记录以仅对每个组计数一次记录。 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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.