2012-05-25 14 views
8

Tome la siguiente expresión: FALSE AND (expression)¿La evaluación lógica de MySQL es floja/produce un cortocircuito en la cláusula JOIN?

Will MySQL evaluar la expresión o simplemente seguir adelante tan pronto como se ve FALSE?

Algunos antecedentes context-- quería acelerar una consulta haciendo:

JOIN... ON (indexed_column1=indexed_column2 AND non_indexed_column_a=non_indexed_column_b)

Para información sobre por qué estoy haciendo esta consulta see this answer

Si se va a evaluar siempre non_indexed_column_a=non_indexed_column_b entonces no se ahorra tiempo con eso.

+0

Yo pensaría que el optimizador de consultas eliminaría este caso trivial en su totalidad. Sin embargo, en casos que no pueden eliminarse estáticamente, tales motores, como SQL Server (concedido, no MySQL) ** no garantizan una orden de evaluación **; ya que esto realmente les ayuda a ser más eficientes con índices y tal. Sería interesante saber cómo funciona la implementación específica de MySQL así que, +1. –

+0

He añadido un poco más de contexto – babonk

+0

http://stackoverflow.com/questions/789231/is-the-sql-where-clause-short-circuit-evaluated (no específica * * a MySQL, pero bien nunca-el- menos), http://stackoverflow.com/questions/4449105/mysql-and-condition –

Respuesta

2

El optimizador de consultas utiliza MySQL los índices siempre que sea posible y utilizar el índice más restrictivo con el fin de eliminar tantas filas como sea posible.

Así que en caso de la consulta siempre será filtrar los registros en función de los índices primeras columnas y luego filtrar los registros de las columnas no son del índice.

También antes de la ejecución de consultas, MySQL elimina el código que siempre va a ser falsa (Dead Code).

Para más detalles ver: http://www.informit.com/articles/article.aspx?p=377652&seqNum=2

Cuestiones relacionadas