使用LINQ to MySQL
MySQL TABLE定义
ID binary(16) PK
UtcTriggerTime datetime NOT NULL
PersonID binary(16) NOT NULL FK
Status int(11) NOT NULL
我有一个 1000s 的PersonIDs(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)上,然后使用PersonIDs数组在一个查询中执行如下操作,但它更慢,当我想到有意义时:
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();
答案 0 :(得分:0)
在我看来,你正在处理由
引起的典型的选择N + 1问题group a by a.PersonID into alerts
select alerts
一部分。 你能查看生成的SQL并看看它是什么样的吗?
如果没有多少值,也不需要将Status放在索引中,因为性能的提升会很小。
如果我的问题是对的,你可以查看这些问题,看看问题是如何处理的:
How to Detect Select n+1 problems in Linq to SQL?
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/