2009-08-15 9 views
5

Kiedy zdecydowałem się użyć OR/M (Entity Framework dla MySQL tym razem) dla mojego nowego projektu miałem nadzieję, że zaoszczędzi mi to czasu, ale wydaje mi się, że zawiodłem (po raz drugi teraz).Entity Framework + MySQL - Dlaczego wydajność jest tak straszna?

Weź ten prosty SQL Query

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

Wykonuje i daje mi wyniki w mniej niż sekundę, tak jak powinien (tabela ma około 60000 wierszy).

Oto odpowiednik LINQ podmiotom zapytania, które napisałem dla tego

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 

Ale ta kwerenda nawet nie wykonuje go razy out ZAWSZE (bez orderby trwa 5 sekund, aby uruchomić)! Mój limit czasu jest ustawiony na 12 sekund, więc możesz sobie wyobrazić, że zabiera on znacznie więcej.

  • Dlaczego tak się dzieje?
  • Czy istnieje sposób, aby zobaczyć, jakie jest rzeczywiste zapytanie SQL, które Entity Framework wysyła do bazy danych?
  • Czy powinienem zrezygnować z EF + MySQL i przejść do standardowego SQL, zanim stracę całą wieczność, próbując sprawić, żeby działało?

Mam skalibrowany moje indeksy, próbował chętny do załadunku (które w rzeczywistości sprawia, że ​​nie nawet bez klauzuli orderby)

Proszę o pomoc, mam zamiar zrezygnować OR/M dla MySQL jako przegrana przyczyna.

+1

Cóż, porzuciłem i wyrzuciłem EF + MySQL –

Odpowiedz

4

Wszystkie moje badania zakończyły się ostatecznie konkluzją, że podczas gdy EF ogólnie jest złe dla wydajności, MySql + EF jest wręcz tandetny. Wybór przez SO L2S nad EF jest dobrym posunięciem i gdybym miał dostęp do bazy danych MS SQL zamiast MySQL, również bym podążał w tym kierunku.

Niestety utknąłem z MySql, ponieważ jest wolny i to zmusiło mnie do rezygnacji z EF. Wracam do twardego kodowania moich zapytań SQL - starego, przetestowanego, wydajnego sposobu, a wyniki są dobre.

Dałem przepustkę MYSQL + EF, ale chciałbym usłyszeć od ludzi, którzy z powodzeniem używali jej w niebanalnym projekcie.

+0

ten sam problem, ponieważ wygenerowany kod SQL nie jest dobry, zobacz: http://stackoverflow.com/questions/3344493/limiting-query-size-with-entity- framework –

+1

Niestety adres URL jest nieprawidłowy http://stackoverflow.com/questions/14191998/linq-to-entity-linq-query-performance-optimization/14192078 –

2

Myślę, że pierwszym krokiem byłoby dowiedzieć się, co SQL jest wysyłane do MySQL. This artykuł wyjaśnia, jak włączyć logowanie w MySQL. Jeśli to możliwe, możesz chcieć sprawdzić, czy .NET 4.0 beta 1 poprawia wygenerowany kod SQL.

+0

. Net 4 nie ma z tym nic wspólnego. Sądzę, że jest to dostawca MySQL Entity Framework, który jest gówniany. –

+1

To, do czego dążyłem, to jeśli generowany jest naprawdę zły kod SQL, możliwe, że z .NET 4.0 możesz zauważyć ulepszenia. Ale przede wszystkim sprawdźmy, co jest wysyłane do MySQL. –

+2

Nie ma wbudowanego dostawcy dla MySQL, więc .NET 4 niczego nie zmieni: P Przypuszczam, że '.Take()' jest po stronie klienta, a nie tłumaczone na 'LIMIT'. – Thorarin

0

Możesz również uzyskać kod SQL od dostawcy EF za pośrednictwem ToTraceString.

+0

Zamierzałem opublikować to jako komentarz do pubb odpowiedź, faktycznie. Daj mu kredyt, nie ja. :) –

+0

sql jest jak 'wybierz * z (wybierz * z postu) orderby addedOn desc limit 0,20', pls zobacz to, to w zasadzie to samo pytanie: http://stackoverflow.com/questions/14191998/linq-to -entity-linq-query-performance-optimization/14192078 # 14192078 –

1

Pomyślnie użyłem MySql z Linq do SQL, używając projektu Open Source DBLinq. Wiem, że to nie Entity Framework, ale modele próbne są znane. Mam nadzieję, że to pomoże każdemu!