我有Mysql数据库,大约有150万个实体。当我尝试使用EFCore1.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核心性能太糟糕了?
发布于 2017-05-06 19:38:13
您的查询正在执行不同的任务。LINQ到实体查询中的一些问题:
Include(...),它将为db.Posts中的每一项急切地加载User。Count()。这可以重写为每组只计算一次记录。User对象的User属性。您可以只选择这个字段并找到相同的结果。在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核心仍然对它允许的分组语句的类型有限制,您可以在第一个ToList语句之后调用Select(...)。
https://stackoverflow.com/questions/43824343
复制相似问题