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) ????)
Czy możesz zamieścić niektóre plany wykonania? – Thilo
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
Co się stanie, jeśli podasz oba? – Thilo