2010-06-16 17 views

Respuesta

7

Mientras que estás haciendo sólo un signo de igual (y no una similar, que puede tener cortocircuito afecta), sólo tiene que reemplazarlo con un valor:

EXPLAIN SELECT foo FROM bar WHERE some_column = 'foo'; 

ya que no es en realidad la ejecución de la consulta, los resultados no deben diferir de los reales. Hay algunos casos en que esto no es cierto (ya mencioné LIKE). He aquí un ejemplo de los diferentes casos de LIKE:

SELECT * FROM a WHERE a.foo LIKE ? 
  1. Param 1 == Foo - ¿Puede usar examinar un índice si existe un índice.
  2. Param 1 == %Foo - Requiere un escaneo completo de tabla, incluso si existe un índice
  3. Param 1 == Foo% - Puede utilizar un recorrido de índice, dependiendo de la cardinalidad del índice y otros factores

Si se está uniendo, y la cláusula where cede a una combinación imposible (y, por lo tanto, provocará un cortocircuito). Por ejemplo:

SELECT * FROM a JOIN b ON a.id = b.id WHERE a.id = ? AND b.id = ? 

Si el primer y segundo parámetros son los mismos, tiene un plan de ejecución, y si son diferentes, será cortocircuito (y devolver 0 filas sin golpear ningún dato) ...

Hay otros, pero eso es todo lo que puedo pensar en la cabeza ahora ...

0

El plan de explicación puede ser diferente dependiendo de lo que haya introducido. Creo que explicar los planes sin un parámetro real no significan nada.

0

No creo que sea posible. WHERE some_column ='value', WHERE some_column = other_column y WHERE some_column = (SELECT .. FROM a JOIN b JOIN c ... WHERE ... ORDER BY ... LIMIT 1) devuelven diferentes planes de ejecución.

+3

Cierto, pero tampoco se les permitiría en la consulta paramaterizada ;-). Todo el parámetro podría reemplazarse con un valor escalar (int, string, null, etc.). Entonces, solo el primero en su ejemplo sería una sustitución apropiada ... – ircmaxell

Cuestiones relacionadas