2012-11-09 100 views
2

雖然這個問題只針對MySQL,但我不介意知道這個答案是否適用於SQL引擎。MySQL查詢效率建議

此外,由於這不是語法查詢,因此爲了簡潔明瞭,我使用了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]是針對這個緩存運行'ed結果?如果不是這樣,我應該那麼查詢分成兩個像這樣:

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

可悲的是,這個問題有點過於寬泛:查詢,方案的細節和RDBMS將會影響答案。在當前版本的MySQL中,除了簡單的布爾簡化和可以使用索引的子句的優先次序之外,我認爲優化器會選擇一些不確定的次序來對剩餘子句進行延遲評估。我不相信有沒有什麼辦法可以在不通過另一個表的情況下影響這一點(儘管在多個查詢中可以使用子查詢中的物化表而不是臨時表)。 – eggyal

回答

0

這是內部查詢優化器的工作,計算出最佳的順序編制根據過濾器的連接。

比如在:

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等)將嘗試事先計算每個中間結果集,以提供最佳的性能,而實際上這裏的引擎做了相當不錯。

但是,一切都依賴於它實際上對您在架構中設置的表和索引的統計信息。除了用數據填充表格之外,這2點是唯一可以影響的,以幫助優化器通過提供正確和準確的信息來做出正確決策。

我希望它有幫助。

ps:看看這個。這是關於下甲骨文在查詢編譯運營商和位次但它可能是反正知道是好事:

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

+0

明白了,並檢查出鏈接。感謝所有的答覆。看起來 - 長話短說 - 我應該安全地玩,並創建中間表以確保事情按照我想要的方式「緩存」。 – RonaldBarzell

+0

我真的,真的不認爲你應該。你應該做的是1-建立一個與你的業務相匹配的DDL,並根據你想要做的查詢來完善它。查詢不應與模型相匹配,相反。 – Sebas

+0

謝謝。我有點這樣做。我還沒有組織我的表格,但我正在從我期望做的查詢向後工作,並嘗試(在規範化的限制之內)來相應地構建我的表格。然而,由於我很少了解(My)SQL如何優化事物,因此我的「查詢優化」主要側重於使我的查詢更易於理解而不是高效。 – RonaldBarzell