C#LINQ MySQL查询优化

时间:2011-11-29 15:16:13

标签: c# mysql linq

使用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();

1 个答案:

答案 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/