[英]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.