2011-09-16 14 views
5

Mam widoku (viewX) na podstawie dołącza niektórych tabelach:Jaka jest różnica między HAVING i WHERE w zapytaniu MySQL?

Gdy używam WHERE, zapytanie jest opóźniony, wykorzystanie procesora idzie do 50% i na koniec muszę zamknąć mysqld.exe usługę i uruchom ponownie, aby spróbować rozwiązać problem ponownie.

Kiedy używam , zapytanie wykonuje się doskonale i szybko, otrzymuję wyniki i wszystko jest gotowe.

Zapytanie jest podobne do tego:

SELECT * FROM viewX WHERE column_of_view = 'foo' 

SELECT * FROM viewX HAVING column_of_view = 'foo' 

Co się dzieje?

Rozwiązanie znalazłem jest zrobić coś takiego:

SELECT * FROM (SELECT * FROM viewX) as T WHERE column_of_view = 'foo' 

SELECT * FROM (SELECT * FROM viewX) as T HAVING column_of_view = 'foo' 

zarówno zapytania działa prawidłowo, ale myślę, że to jest złe! (SELECT * FROM (... viewX) ????)

+0

Czy możesz zamieścić niektóre plany wykonania? – Thilo

+0

Moje najlepsze przypuszczenie jest takie, że używając HAVING mylisz się z optymalizatorem zapytań, tak jak wprowadzasz w błąd, i że to zamieszanie skutkuje innym planem wykonania (inna kolejność i metody łączenia), co w tym przypadku może faktycznie być korzystne (z wiele złączeń, potencjał dla suboptymalnego porządku łączenia jest ogromny). Czy po prostu zwraca kilka pierwszych wierszy szybciej, czy też cały wybór dla wszystkich wierszy jest szybszy? – Thilo

+0

Co się stanie, jeśli podasz oba? – Thilo

Odpowiedz

0

To zależy od definicji widoku - uwzględniając klauzulę powinny mieć zastosowanie jedynie do zapytania kruszywa i jego zastosowanie po zgrupowania. Czy spojrzałeś na dwa plany zapytania (z wyjaśnieniem)?

0

GDZIE jest stosowany podczas podawania i żadne aliasy są jeszcze

HAVING filtry wierszy po wymieniając wszystkie możliwe wiersze tak aliasy są generowane

Nie powinno być problemem podczas filtrowania wierszy inline dostępny .

1

Posiadanie jest używane dla funkcji agregujących, takich jak suma, średnia itd. I może być używane tylko w instrukcji select. Where klauzula nie działa w zbiorczych warunkach np .: gdzie suma (znacznik)> 300 // nie jest prawdziwa

Powiązane problemy