2011-11-29 86 views
0

使用LINQ到MySQLC#LINQ MySQL查询优化

MySQL的表定义

ID    binary(16) PK 
UtcTriggerTime datetime NOT NULL 
PersonID  binary(16) NOT NULL FK 
Status   int(11) NOT NULL 

我有PersonIDs的(GUID)的一个阵列,并且对于每个是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,状态),然后用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

在我看来,你处理的是典型的选择N这是由

group a by a.PersonID into alerts 
select alerts 

部分引起+ 1点的问题。 你可以看看生成的SQL,看看它看起来像什么吗?

此外,如果没有多少值,则不需要将状态置于索引中,因为性能的增加会很小。

如果我quess是正确的,你可以看看这些问题,看问题如何处理:

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/

+0

谢谢你Jenea。由LINQ生成的SQL的方式太大,因为contains子句中的ID数量太大。同样在我的命令窗口中,它会被剪辑,尽管我猜想肯定有一种方法可以让 – Shahid

+0

以较少的用户ID运行。查询计划应该是一样的(不确定),你将能够看到发生了什么。 –