我基礎上有一個觀點(viewX
)連接的某些表:MySQL查詢中的HAVING和WHERE有什麼區別?
當我使用WHERE
,查詢被延遲,處理器使用去50%,最後我需要關閉mysqld.exe
服務並重新啓動,以嘗試解決問題再次出現。
當我使用HAVING
時,查詢執行得非常快速,我得到結果並且一切就緒。
查詢與此類似:
SELECT * FROM viewX WHERE column_of_view = 'foo'
SELECT * FROM viewX HAVING column_of_view = 'foo'
這是怎麼回事?
我找到解決的辦法是做這樣的事情:
SELECT * FROM (SELECT * FROM viewX) as T WHERE column_of_view = 'foo'
SELECT * FROM (SELECT * FROM viewX) as T HAVING column_of_view = 'foo'
兩個查詢工作正常,但我覺得這是不好的! (SELECT * FROM(... viewX)????)
你可以發佈一些執行計劃嗎? – Thilo
我最好的猜測是,通過使用HAVING,您就像混淆了我一樣混淆了查詢優化器,並且這種混淆導致了不同的執行計劃(不同的連接順序和方法),在這種情況下可能實際上是有益的許多聯接,潛在的次優連接順序是巨大的)。它是否只是更快地返回前幾行,還是所有行的整個選擇也更快? – Thilo
如果指定兩者,會發生什麼情況? – Thilo