2009-08-15 10 views
5

Quando ho deciso di utilizzare un OR/M (Entity Framework per MySQL questa volta) per il mio nuovo progetto speravo che mi avrebbe risparmiato tempo, ma mi sembra di averlo fallito (per la seconda volta ora).Entity Framework + MySQL - Perché le prestazioni sono così terribili?

prendere questa semplice query SQL

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

Esegue e mi dà i risultati in meno di un secondo come si deve (la tabella contiene circa 60.000 righe).

Ecco il LINQ equivalente a interrogazione Entità che ho scritto per questo

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 

Ma questa query mai esegue il tempo è scaduto SEMPRE (senza orderby ci vogliono 5 secondi per l'esecuzione)! Il mio timeout è impostato su 12 secondi, quindi puoi immaginare che ci voglia molto di più.

  • Perché sta succedendo?
  • C'è un modo per vedere qual è la query SQL effettiva che Entity Framework invia al db?
  • Dovrei rinunciare a EF + MySQL e passare allo standard SQL prima di perdere l'eternità cercando di farlo funzionare?

ho ricalibrato i miei indici, tentarono eager loading (il che rende di fatto fallire anche senza la clausola orderby)

prega di aiuto, sto per rinunciare o/M per MySQL come perduta causa.

+1

Bene, ho rinunciato e scartato EF + MySQL –

risposta

4

Tutte le mie ricerche sono infine culminate nella conclusione che, sebbene l'EF in generale sia dannoso per le prestazioni, MySql + EF è decisamente scadente. La scelta di SO di L2S su EF è una buona mossa e se avessi accesso a un database MS Sql anziché a MySQL, mi sarei mosso anche in quella direzione.

Sfortunatamente sono bloccato con MySql perché è gratuito e questo mi ha costretto a rinunciare a EF. Ora sono tornato a codificare hardly le mie query SQL il vecchio, testato, modo efficace ed i risultati sono buoni.

Ho dato a MYSql + EF un pass, ma mi piacerebbe sentire le persone che lo hanno utilizzato con successo in un progetto non banale.

+0

stesso problema, perché l'SQL generato non è buono, vedi: http://stackoverflow.com/questions/3344493/limiting-query-size-with-entity- framework –

+1

scusa l'URL è sbagliato http://stackoverflow.com/questions/14191998/linq-to-entity-linq-query-performance-optimization/14192078 –

2

Penso che il primo passo sarebbe capire quale SQL viene inviato a MySQL. L'articolo This spiega come attivare la registrazione in MySQL. Se possibile, si potrebbe voler vedere se .NET 4.0 beta 1 migliora l'SQL generato.

+0

. Net 4 non ha nulla a che fare con questo. Suppongo che sia il provider MySQL di Entity Framework che è schifoso. –

+1

Quello che stavo ottenendo è che se SQL veramente brutto viene generato è possibile che con .NET 4.0 si vedano miglioramenti. Ma prima di tutto vediamo cosa viene inviato a MySQL. –

+2

Non esiste un provider integrato per MySQL, quindi .NET 4 non cambierà una cosa: P La mia ipotesi è che il '.Take()' è fatto lato client piuttosto che essere tradotto in un 'LIMIT'. – Thorarin

0

È inoltre possibile ottenere l'SQL dal provider EF tramite ToTraceString.

+0

intendevo postare questo come un commento a pubb's risposta, in realtà. Dare credito a lui, non a me. :) –

+0

sql è come 'select * from (seleziona * dal post) orderby addedOn desc limit 0,20', pls guarda questo, è praticamente la stessa domanda: http://stackoverflow.com/questions/14191998/linq-to -entity-linq-query-performance-optimization/14192078 # 14192078 –

1

ho usato con successo MySql con Linq per SQL, utilizzando il progetto open source DBLinq. So che non è Entity Framework ma i modelli probramming sono familiari. Spero che questo aiuti chiunque!

Problemi correlati