c# LINQ MySQL查询优化
本文关键字:查询优化 MySQL LINQ | 更新日期: 2023-09-27 18:16:19
MySQL使用LINQ
ID binary(16) PK
UtcTriggerTime datetime NOT NULL
PersonID binary(16) NOT NULL FK
Status int(11) NOT NULL
我有一个1000s的PersonID (Guids)数组,对于每个PersonID,我想从表中选择符合以下条件的匹配记录:
UtcTriggerTime >= PREDEFINED_DATE_TIME (e.g. UtcNow - 30days)
AND
Status=1 OR Status=2
我正在使用
foreach(var personID in personIDsArray){
var qryResult = (from a in AlertObjects.AlertsTriggered
where a.PersonID == personID &&
(a.Status == 1 || a.Status == 2) &&
a.UtcTriggerTime >= PREDEFINED_DATE_TIME
select a).ToArray();
}
有什么可能的选项来优化它的性能?或者有吗?
我试着把索引(UtcTriggerTime, PersonID, Status),然后使用PersonID数组在一个查询中做到这一点,如下所示,但它甚至更慢,当我想到有意义:
var qryResult = (from a in AlertObjects.AlertsTriggered
where personIDsArray.Contains(a.PersonID) &&
(a.Status == 1 || a.Status == 2) &&
a.UtcTimeTriggered >= PREDEFINED_DATE_TIME
group a by a.PersonID into alerts
select alerts).ToArray();
在我看来,你正在处理典型的Select N+1问题,这是由
引起的。group a by a.PersonID into alerts
select alerts
部分。您可以查看生成的SQL,看看它是什么样子吗?
如果没有很多值,也不需要在index中添加Status,因为对性能的提高将是最小的。
如果我的猜测是正确的,你可以看看这些问题,看看如何处理这个问题:
如何检测Linq to SQL中的Select n+1问题?
http://www.west-wind.com/weblog/posts/2009/Oct/12/LINQ-to-SQL-Lazy-Loading-and-Prefetching
我不熟悉MySql,但在我看来,这个链接可能有助于诊断哪些查询是慢的。
http://www.electrictoolbox.com/show-running-queries-mysql/