2012-05-25 16 views
8

Nehmen Sie den folgenden Ausdruck: FALSE AND (expression)Ist MySQL Logik Auswertung faul/Kurzschluss in JOIN-Klausel?

Wird MySQL den Ausdruck auswerten oder einfach nur so schnell weitergehen, wie es sieht FALSE?

Einige Hintergrund context-- ich eine Abfrage, indem Sie beschleunigen wollte: auf

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

Für Hintergrund, warum ich diese Abfrage mache see this answer

Wenn es wird immer non_indexed_column_a=non_indexed_column_b bewerten dann ist damit keine Zeit eingespart.

+0

ich die Abfrage-Optimierer würden beseitigen völlig diesen trivialen Fall denken würde. In Fällen, die nicht statisch eliminiert werden können, garantieren solche Engines wie SQL Server (gewährt, nicht MySQL) ** keine Bewertungsreihenfolge **; wie dies tatsächlich hilft ihnen effizienter mit Indizes und so. Es wäre interessant zu wissen, wie die MySQL-spezifische Implementierung funktioniert, +1. –

+0

Ich habe etwas mehr Kontext hinzugefügt – babonk

+0

http://stackoverflow.com/questions/789231/is-the-sql-where-clause-short-circuit-evaluated (nicht * spezifisch * zu MySQL, aber gut nie-die- weniger), http://stackoverflow.com/questions/4449105/mysql-and-condition –

Antwort

2

Der MySQL-Abfrageoptimierer verwendet wann immer möglich Indizes und verwendet den restriktivsten Index, um so viele Zeilen wie möglich zu eliminieren.

Also im Falle Ihrer Abfrage wird es immer die Datensätze basierend auf ersten Indizes Spalten filtern und dann die Datensätze aus Nicht-Index-Spalten filtern.

Auch vor der Ausführung der Abfrage beseitigt MySQL den Code, der immer falsch sein wird (Dead Code).

Weitere Informationen finden Sie unter: http://www.informit.com/articles/article.aspx?p=377652&seqNum=2