簡體   English   中英

EF Core Mysql性能

[英]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到實體查詢中的一些問題:

  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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM