2012-05-25 11 views
8

Take następujące wyrażenie: FALSE AND (expression)Czy ocena logiki MySQL jest leniwy/występuje zwarcie w klauzuli JOIN?

Będzie MySQL ocena ekspresji lub po prostu przejść jak tylko widzi FALSE?

Niektóre tła context-- chciałem przyspieszyć zapytanie wykonując:

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

Na tle dlaczego robię to zapytanie see this answer

Jeśli to będzie zawsze oceniać non_indexed_column_a=non_indexed_column_b to nie oszczędza czasu.

+0

Myślę optymalizator kwerendy wyeliminuje tę trywialną sprawę całkowicie. Jednak w przypadkach, których nie można wyeliminować statycznie, takie silniki, takie jak SQL Server (przyznane, nie MySQL) ** nie gwarantują zamówienia oceny **; ponieważ to faktycznie pomaga im być bardziej wydajnym dzięki indeksom i tym podobnym. Ciekawe byłoby wiedzieć, jak działa specyficzna dla MySQL implementacja +1. –

+0

Dodałem trochę więcej kontekstu – babonk

+0

http://stackoverflow.com/questions/789231/is-the-sql-where-clause-short-circuit-evaluated (nie * specyficzne * do MySQL, ale dobre nigdy-nie- mniej), http://stackoverflow.com/questions/4449105/mysql-and-condition –

Odpowiedz

2

Optymalizator zapytań MySQL używa indeksów ilekroć jest to możliwe i używa najbardziej restrykcyjnego indeksu, aby wyeliminować jak najwięcej wierszy.

W przypadku zapytania zawsze będzie filtrować rekordy na podstawie kolumn pierwszego indeksu, a następnie filtrować rekordy z kolumn bez indeksu.

Również przed wykonaniem zapytania MySQL eliminuje kod, który zawsze będzie fałszywy (Dead Code).

Aby uzyskać więcej informacji zobacz: http://www.informit.com/articles/article.aspx?p=377652&seqNum=2

Powiązane problemy