【问题标题】:Entity Framework + MySQL - Why is the performance so terrible?Entity Framework + MySQL - 为什么性能如此糟糕?
【发布时间】:2010-11-19 20:39:51
【问题描述】:

当我决定为我的新项目使用 OR/M(这次是 MySQL 的实体框架)时,我希望它可以节省我的时间,但我似乎失败了(现在是第二次)。

使用这个简单的 SQL 查询

SELECT * FROM POST ORDER BY addedOn DESC LIMIT 0, 50 

它会在不到一秒的时间内执行并给出结果(该表大约有 60,000 行)。

这是我为此编写的等效 LINQ To Entities 查询

var q = (from p in db.post
            orderby p.addedOn descending
             select p).Take(50);

    var q1 = q.ToList(); //This is where the query is fetched and timed out

但是这个查询甚至永远不会执行它总是超时(没有 orderby,它需要 5 秒才能运行)!我的超时设置为 12 秒,因此您可以想象它花费的时间远不止于此。

  • 为什么会这样?
  • 有什么方法可以查看实体框架发送到数据库的实际 SQL 查询是什么?
  • 我是否应该放弃 EF+MySQL 并转而使用标准 SQL,以免失去所有试图使其正常工作的永恒?

我重新校准了我的索引,尝试了急切加载(即使没有 orderby 子句,它实际上也会失败)

请帮忙,我将放弃 MySQL 的 OR/M 作为一个失败的原因。

【问题讨论】:

  • 好吧,我已经放弃EF+MySQL了

标签: mysql entity-framework linq-to-entities


【解决方案1】:

我认为第一步是弄清楚将什么 SQL 发送到 MySQL。 This 文章解释了如何在 MySQL 中打开日志记录。如果可能,您可能想看看.NET 4.0 beta 1 是否改进了生成的 SQL。

【讨论】:

  • .Net 4 与此无关。我认为这是糟糕的 MySQL Entity Framework 提供程序。
  • 我的意思是,如果生成了非常糟糕的 SQL,那么在 .NET 4.0 中您可能会看到改进。但首先让我们看看发送到 MySQL 的内容。
  • 没有内置的 MySQL 提供程序,因此 .NET 4 不会改变任何事情:P 我的猜测是 .Take() 是在客户端完成的,而不是被转换为 @987654324 @.
  • 这可能是 Thorarin 的一个可能原因,但我认为这有点不太可能,因为没有 orderby 子句,带有 take 的查询确实返回一个值,但没有 take 它不会返回一个值(行太多)。
  • @AndyGaskell 生成的 SQL 类似于select * from (select * from post) orderby addedOn desc limit 0,20 显然这会很慢,有没有办法改进这个?
【解决方案2】:

您还可以通过 ToTraceString 从 EF 提供程序获取 SQL。

【讨论】:

  • 实际上,我的意思是将其发布为对 pubb 答案的评论。归功于他,而不是我。 :)
  • sql就像select * from (select * from post) orderby addedOn desc limit 0,20,请看这个,基本上是同一个问题:stackoverflow.com/questions/14191998/…
【解决方案3】:

我所有的研究最终得出的结论是,虽然 EF 通常不利于性能,但 MySql+EF 是彻头彻尾的粗制滥造。 SO 选择 L2S 而不是 EF 是一个很好的举措,如果我可以访问 MS Sql 数据库而不是 MySQL,我也会朝那个方向发展。

不幸的是,我被 MySql 困住了,因为它是免费的,这迫使我放弃了 EF。我现在又回到了用旧的、经过测试的、有效的方式对我的 SQL 查询进行硬编码,结果很好。

我通过了 MYSql + EF,但我很想听听那些在一个不平凡的项目中成功使用它的人。

【讨论】:

【解决方案4】:

我已经使用开源项目 DBLinq 成功地将 MySql 与 Linq to SQL 一起使用。我知道它不是实体框架,但 probramming 模型很熟悉。希望这对任何人都有帮助!

【讨论】:

    猜你喜欢
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2015-08-07
    • 2014-05-08
    • 2021-11-23
    • 2020-05-10
    相关资源
    最近更新 更多