2012-05-25 5 views
8

Prendere la seguente espressione: FALSE AND (expression)La valutazione logica MySQL è pigro/cortocircuitante nella clausola JOIN?

Sarà MySQL valutare l'espressione o semplicemente andare avanti, non appena vede FALSE?

Alcuni retroscena context-- ho voluto velocizzare una query facendo:

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

Per sfondo sul motivo per cui sto facendo questa domanda see this answer

Se è intenzione di valutare sempre non_indexed_column_a=non_indexed_column_b quindi nessun tempo è stato salvato con quello.

+0

penserei Query Optimizer eliminerebbe questo caso banale del tutto. Tuttavia, nei casi che non possono essere eliminati staticamente, tali motori, come SQL Server (concesso, non MySQL) ** non garantiscono un ordine di valutazione **; in quanto ciò li aiuta effettivamente a essere più efficienti con indici e simili. Sarebbe interessante sapere come funziona l'implementazione specifica di MySQL, +1. –

+0

Ho aggiunto qualche altro contesto – babonk

+0

http://stackoverflow.com/questions/789231/is-the-sql-where-clause-short-circuit-evaluated (non * specifico * a MySQL, ma buono mai-il- meno), http://stackoverflow.com/questions/4449105/mysql-and-condition –

risposta

2

MySQL Query Optimizer utilizza gli indici ogni volta che è possibile e utilizza l'indice più restrittivo per eliminare il maggior numero di righe possibile.

Pertanto, in caso di query, filtrerà sempre i record in base alle prime colonne degli indici e quindi filtrerà i record da colonne non indicizzate.

Anche prima dell'esecuzione della query, MySQL elimina il codice che sarà sempre falso (Dead Code).

Per maggiori dettagli si veda: http://www.informit.com/articles/article.aspx?p=377652&seqNum=2

Problemi correlati