【问题标题】:C# Entity FrameWork MySQL Slow Queries Count()C# Entity FrameWork MySQL 慢查询 Count()
【发布时间】:2011-02-22 04:19:13
【问题描述】:

我在使用 MySQL 和 Entity Framework 4.0 时遇到了严重问题。我已经将一个表放到 EF 设计器表面上,一切看起来都还不错。但是,当我以以下方式执行查询时:

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 中选择 anything 似乎会产生完全疯狂的查询。

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 绝对是在错误的地方。当然,这对我根本不起作用。

【问题讨论】:

  • 当你像这样重写查询时会发生什么:int numRows = dc.myTable.Select(a=> a.AnyColumnInPricingTable).Count();
  • 我不骗你..与上面的输出相同。

标签: c# mysql entity-framework


【解决方案1】:

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

【讨论】:

  • +1。如果您的桌子上没有 PK,请添加它。如果您没有在 EDMX 中为视图定义键,请也添加它。
  • 哦哇!有没有办法在设计器中设置/避免这个,或者编辑总是一个要求?你是绝对正确的,有一个 DefiningQuery 被传入。这就是我作为 EF Newb 所得到的。不过,L2S MySQL 工作得很好,这就是我在等待时所做的。谢谢德瓦特!
  • 跟进 - 已测试,这确实是问题所在。如果可以的话,我完全会给你更多的分数。感谢您指出这一点。希望除了为 EDMX 编辑 XML 之外还有其他方法,但我很高兴知道问题所在以及解决方案。
猜你喜欢
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 2020-08-23
  • 1970-01-01
  • 2013-03-23
相关资源
最近更新 更多