C#实体FrameWork MySQL慢查询计数()

时间:2010-05-21 02:20:32

标签: c# mysql entity-framework

我遇到了MySQL和Entity Framework 4.0的严重问题。我已将表格放到EF Designer表面上,一切似乎都没问题。但是,当我以下列方式执行查询时:

using(entityContext dc = new entityContext()) {
  int numRows = dc.myTable.Count();
}

生成的查询如下所示:

SELECT `GroupBy1`.`A1` AS `C1`
FROM   (SELECT Count(1) AS `A1`
        FROM   (SELECT `pricing table`.`a`,
                       `pricing table`.`b`,
                       `pricing table`.`c`,
                       `pricing table`.`d`,
                       `pricing table`.`e`,
                       `pricing table`.`f`,
                       `pricing table`.`g`,
                       `pricing table`.`h`,
                       `pricing table`.`i`
                FROM   `pricing table` AS `pricing table`) AS `Extent1`) AS `GroupBy1`

显而易见,这是一个极其未经优化的查询。它正在选择每一行!这不是最优的,我甚至不可能在此时使用MySQL + EF。

我已经尝试了MySQL 6.3.1 [安装很有趣]和DevArt的dotConnect for MySQL,两者都产生了相同的结果。这个表有150万条记录..并且需要6-11秒才能执行!

我做错了什么?是否有任何方法可以优化此[和其他查询]以生成合理的代码,如:

SELECT COUNT(*) FROM table

使用SQLServer生成相同的查询几乎没有时间,并生成合理的代码。

帮助!

编辑:我还想指出,我切换到DevArt dotConnect MySQL LINQ to SQL驱动程序,使用L2S over EF的速度提高了1000000倍。这也包括查询。

在EF中选择任何似乎会产生完全疯狂的查询。

dc.pricing_table.OrderBy(j => j.a).Skip(100).Take(100).ToList();

SELECT   `Extent1`.`a`,
         `Extent1`.`b`,
         `Extent1`.`c`,
         `Extent1`.`d`,
         `Extent1`.`e`,
         `Extent1`.`f`,
         `Extent1`.`g`,
         `Extent1`.`h`,
         `Extent1`.`i`
FROM     (SELECT `pricing table `.`a`,
                 `pricing table `.`b`,
                 `pricing table `.`c`,
                 `pricing table `.`d`,
                 `pricing table `.`e`,
                 `pricing table `.`f`,
                 `pricing table `.`g`,
                 `pricing table `.`h`,
                 `pricing table `.`i`
          FROM   `pricing table ` AS `pricing table`) AS `Extent1`
ORDER BY `a` ASC
LIMIT    100,100

再次,一个完全低估​​的错误查询。 LIMIT 100,100绝对是错误的地方。这当然不会对我有用。

1 个答案:

答案 0 :(得分:7)

问题可能与您在.edmx或.edml文件中定义查询有关。
如果您有View,或者您的表没有定义主键,Designer通常会生成DefiningQuery。请检查模型的XML代码并删除DefiningQuery,以防它存在但不必要。