首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EF核心Mysql性能

EF核心Mysql性能
EN

Stack Overflow用户
提问于 2017-05-06 19:04:17
回答 1查看 1.2K关注 0票数 0

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

代码语言:javascript
复制
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秒才能完成。

代码语言:javascript
复制
SELECT user.Name, count(*) c 
FROM post 
JOIN user ON post.UserId = user.Id 
GROUP BY user.Name 
ORDER BY c DESC

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-06 19:38:13

您的查询正在执行不同的任务。LINQ到实体查询中的一些问题:

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

原版:

代码语言:javascript
复制
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();

建议:

代码语言:javascript
复制
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(...)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43824343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档