2009-08-15 18 views
5

Cuando decidí usar un OR/M (Entity Framework para MySQL esta vez) para mi nuevo proyecto, esperaba que me ahorrara tiempo, pero parece que lo he fallado (por segunda vez ahora).Entity Framework + MySQL - ¿Por qué el rendimiento es tan terrible?

Tome este sencillo consultas SQL

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

Ejecuta y me da resultados en menos de un segundo como debería (la mesa tiene unos 60.000 filas).

Aquí está el LINQ equivalente a las entidades consulta que escribí para este

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 

Pero esta consulta ni siquiera se ejecuta el tiempo de espera SIEMPRE (sin orderby se tarda 5 segundos para correr)! Mi tiempo de espera se establece en 12 segundos para que pueda imaginarse que está tomando mucho más que eso.

  • ¿Por qué sucede esto?
  • ¿Hay alguna manera de ver cuál es la consulta SQL real que Entity Framework está enviando a la base de datos?
  • ¿Debo abandonar EF + MySQL y pasar al SQL estándar antes de perder toda la eternidad tratando de hacerlo funcionar?

he recalibrado mis índices, trataron de carga ansiosa (que en realidad hace que falle incluso sin la cláusula orderby)

Por favor ayuda, estoy a punto de renunciar O/M para MySQL como una perdida porque.

+1

Bueno, me he rendido y descartado EF + MySQL –

Respuesta

4

Toda mi investigación finalmente culminó en la conclusión de que aunque EF en general es malo para el rendimiento, MySql + EF es francamente de mala calidad. La elección de SO de L2S sobre EF es una buena jugada y si tuviera acceso a una base de datos MS Sql en lugar de MySQL también me habría movido en esa dirección.

Desafortunadamente estoy atrapado con MySql porque es gratis y eso me ha obligado a renunciar a EF. Ahora he vuelto a codificar mis consultas SQL de la manera antigua, probada y eficiente, y los resultados son buenos.

Le di un pase a MYSql + EF, pero me encantaría saber de personas que lo han utilizado con éxito en un proyecto no trivial.

+0

mismo problema, porque el SQL generado no es bueno, ver: http://stackoverflow.com/questions/3344493/limiting-query-size-with-entity- marco –

+1

siento que la URL es incorrecta http://stackoverflow.com/questions/14191998/linq-to-entity-linq-query-performance-optimization/14192078 –

2

Creo que el primer paso sería averiguar qué SQL se está enviando a MySQL. El artículo This explica cómo activar el registro en MySQL. Si es posible, es posible que desee ver si .NET 4.0 beta 1 mejora el SQL generado.

+0

.Net 4 no tiene nada que ver con esto. Considero que es el proveedor de MySQL Entity Framework el que es malo. –

+1

A lo que me refería es si realmente se está generando SQL, es posible que con .NET 4.0 pueda ver mejoras. Pero antes que nada veamos qué se envía a MySQL. –

+2

No hay un proveedor incorporado para MySQL, por lo que .NET 4 no cambiará nada: P Supongo que el '.Take()' se realiza en el lado del cliente en lugar de traducirse en un 'LIMIT'. – Thorarin

0

También puede obtener el SQL del proveedor de EF a través de ToTraceString.

+0

Quise publicar esto como un comentario para pubb's respuesta, en realidad. Dale crédito a él, no a mí. :) –

+0

el sql es como 'select * from (select * from post) orderby addedOn desc limit 0,20', pls ver esto, es básicamente la misma pregunta: http://stackoverflow.com/questions/14191998/linq-to -entity-linq-query-performance-optimization/14192078 # 14192078 –

1

he utilizado con éxito MySql con Linq a SQL, utilizando el proyecto de código abierto DBLinq. Sé que no es Entity Framework, pero los modelos de probramming son familiares. Espero que esto ayude a cualquiera!

Cuestiones relacionadas