2009-08-15 84 views
5

當我決定爲我的新項目使用OR/M(此次MySQL的實體框架)時,我希望能節省時間,但我似乎已經失敗了(第二次)。實體框架+ MySQL - 爲什麼表現如此糟糕?

把這個簡單的SQL查詢

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

它執行,給我結果不到一秒鐘,因爲它應該(表中有大約60,000行)。

這裏是相當於LINQ到實體查詢,我寫這個

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 

但此查詢甚至從來沒有超時總是執行它(不排序依據需要5秒的運行)!我的超時時間設置爲12秒,因此您可以想象它所花的時間遠不止於此。

  • 這是怎麼發生的?
  • 有沒有一種方法,我可以看到什麼是實體框架發送到數據庫的實際SQL查詢?
  • 我應該放棄EF + MySQL並轉移到標準SQL之前,我失去了所有的永恆努力使其工作?

我重新調整我的索引,試圖預先加載(這實際上使得它失敗甚至沒有排序依據條款)

請幫幫忙,我快要放棄或者/ M爲MySQL爲丟失原因。

+1

那麼,我已經放棄並丟棄了EF + MySQL – 2009-08-15 15:38:22

回答

4

我所有的研究最終都得出了這樣的結論:雖然EF一般對性能不利,但MySql + EF卻是徹頭徹尾的劣質產品。 SO在L2上的L2S選擇是一個很好的舉措,如果我有權訪問MS Sql數據庫而不是MySQL,那麼我也會朝這個方向發展。

不幸的是我被MySql卡住了,因爲它是免費的,這迫使我放棄EF。我現在回到硬編碼我的SQL查詢舊的,測試,有效的方式,結果是好的。

我給了MYSQL + EF一個通行證,但我很想聽聽那些已經成功在一個非平凡項目中使用它的人。

+0

同樣的問題,因爲生成的SQL不好,請看:http://stackoverflow.com/questions/3344493/limiting-query-size-with-entity-框架 – 2013-01-07 09:01:28

+1

對不起,URL是錯的http://stackoverflow.com/questions/14191998/linq-to-entity-linq-query-performance-optimization/14192078 – 2013-01-07 09:07:33

2

我認爲第一步就是搞清楚什麼是SQL發送到MySQL。文章解釋瞭如何打開MySQL中的日誌記錄。如果可能的話,您可能想查看.NET 4.0 beta 1是否改進了生成的SQL。

+0

.Net 4與此無關。我認爲這是MySQL實體框架提供商是蹩腳的。 – 2009-08-15 07:46:00

+1

我得到的是,如果生成的SQL非常糟糕,那麼使用.NET 4.0可能會看到改進。但首先讓我們看看發送給MySQL的內容。 – 2009-08-15 07:48:23

+2

沒有MySQL的內置提供者,所以.NET 4不會改變一件事:P我的猜測是'.Take()'在客戶端完成,而不是被轉換爲'LIMIT'。 – Thorarin 2009-08-15 08:15:09

0

您還可以通過ToTraceString從EF提供程序獲取SQL。

+0

我打算髮布這作爲評論pubb實際上回答。把功勞歸功於他,而不是我。 :) – 2009-08-17 19:15:57

+0

sql就像'select * from(select * from post)orderby addedOn desc limit 0,20',請看這個,它基本上是相同的問題:http://stackoverflow.com/questions/14191998/linq-to -entity-linq-query-performance-optimization/14192078#14192078 – 2013-01-07 09:13:06

1

我已經成功地使用MySql和Linq to SQL,使用開源項目DBLinq。我知道它不是實體框架,但它的模型很熟悉。希望這有助於任何人!