2010-11-25 9 views
5
EXPLAIN SELECT node_id 
      FROM node 
     WHERE person_id IN (SELECT person_id 
           FROM user 
           WHERE is_locked = 0); 

Resultados en MySql que me dicen que la subconsulta se deriva. ¡Pero no lo es!¡MySQL cree que la subconsulta se deriva cuando no lo es!

(sé que esto podría fácilmente ser re-escrita como una combinación, pero quiero saber por qué MySQL piensa que esto es una sub consulta dependiente.)

+1

No soy experto en MySQL, pero he leído a varias personas que están aquí en Stackoverflow afirman que MySQL tiene un punto ciego en su optimizador de consultas exactamente en esta situación. –

+0

+1 Porque MySQL es realmente malo para detectar una subconsulta dependiente y no hay nada que puedas hacer al respecto. – AndreKR

+1

En mi comprensión de los términos, la sub-selección se deriva (una tabla resultante se deriva de la consulta) pero no correlacionada (la subconsulta no utiliza ningún dato desde fuera de sí misma), también conocida como dependiente. Eso significa que solo debe ejecutarse una vez, no una vez por fila. – RedFilter

Respuesta

3

Se trata de un error en el optimizador de consultas MySQL. Parecería que, si la tabla en la subconsulta coincide con la tabla en la consulta principal, se considera una subconsulta dependiente, incluso si obviamente no debería ser, y no hay una solución fácil. Lo siento; ir por la unión.

+3

Es una verdadera lástima porque ahora hay millones de usuarios de MySQL (o principalmente) que piensan que hay algo intrínsecamente no productivo sobre esta construcción cuando, de hecho, es solo una falla de MySQL específicamente. –

+1

Acabo de decir que MySQL puede llegar a la versión 5 con un error tan básico y serio. – Sean

Cuestiones relacionadas