簡體   English   中英

MySQL查詢效率建議

[英]MySQL Query Efficiency Suggestion

盡管這個問題是特定於MySQL的,但我不介意知道這個答案是否通常適用於SQL引擎。

另外,由於這不是語法查詢,因此為了簡潔/明了,我使用了psuedo-SQL。

假設C [1] .. C [M]是一組條件(用AND或OR分隔),而Q [1] .. Q [N]是另一組條件(用OR分隔)。 我想使用C [1] ... C [M]過濾表,並希望從此過濾后的表中匹配Q [1] ... Q [N]的所有行。

如果我要這樣做:

SELECT ... FROM  ... WHERE (C[1]...C[M]) AND (Q[1]...Q[N])

是否會對此進行自動優化,以使C [1] ... C [M]僅被發現一次,並且每個Q [i]都會針對此緩存的結果運行? 如果沒有,那么我應該將查詢分成兩個這樣:

INSERT INTO TEMP ... SELECT ... FROM ... WHERE C[1]...C[N]
SELECT ... FROM TEMP WHERE Q[1]...Q[N]

這是內部查詢優化器的工作,可以根據過濾器來計算用於編譯聯接的最佳順序。

例如在:

SELECT * 
FROM
    table1 
        INNER JOIN table2 ON table1.id = table2.id AND table2.column = Y
        INNER JOIN table3 ON table3.id2 = table2.id2  AND table3.column = Z
WHERE
    table1.column = X

Mysql(/ oracle / sqlserver等...)會嘗試預先計算每個中間結果集以提供最佳性能,而實際上,引擎在此方面做得很好。

但是,一切都取決於它實際上具有的有關表和在體系結構中設置的索引的統計信息。 這兩個要點(除了用數據填充表外……)是您可以影響的唯一因素,它可以通過為優化器提供正確和准確的信息來幫助其做出正確的決策。

希望對您有所幫助。

ps:看看這個。 這與oracle下查詢編譯中的運算符和優先級有關,但無論如何還是要知道的一件好事:

http://ezinearticles.com/?Oracle-SQL---The-Importance-of-Order-of-Precedence&id=1597846

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM