2012-01-30 87 views
0

我想問一個關於數據庫查詢的問題。在查詢的情況下,查詢的where子句來自另一個查詢。例如嵌套查詢的執行

select ? from ? where ? = select ? from ? 

這是一個簡單的例子,所以很容易寫這個。但對於更復雜的情況,我想知道什麼是性能最好的方法。加入?單獨查詢?嵌套或另一個?

謝謝你的回答。

最好的問候。

+2

依賴於RDBMS的優化器,但聯接通常是首選形式。 – 2012-01-30 07:47:01

回答

1

您應該測試它。這些事情很大程度上取決於查詢的細節以及它可以使用的索引。

根據我的經驗,JOIN往往比MySQL中的嵌套查詢更快。在某些情況下,MySQL不是很聰明,似乎對外部查詢產生的每一行運行子查詢。

您可以在官方文檔中瞭解更多關於這些事情:

優化子查詢:http://dev.mysql.com/doc/refman/5.6/en/optimizing-subqueries.html
將子查詢重寫爲連接:http://dev.mysql.com/doc/refman/5.6/en/rewriting-subqueries.html

0

米奇和喬尼表示,這取決於。但通常加入將提供最佳性能。您試圖避免爲外部查詢的每一行運行嵌套查詢。無論如何,一個好的查詢優化器可能會爲你做這件事,解釋你正在嘗試做什麼,從根本上「修復」你的錯誤。但是對於絕大多數查詢,您應該首先將它作爲聯接進行編寫。這樣你就明確了你要做的事情,而且你完全瞭解自己正在做什麼,以及最有效的工作方式。

0

我認爲連接速度更快,主要是因爲你有一個等價的顯式連接。仍然使用解釋來查看SQl引擎如何解釋它們的差異。
我不希望這些差異很大,在使用聯接而不是子查詢時,您可以獲得真正的大性能提升,這是在您使用相關子查詢時。

1

這是與案例有關的。如果你在內部查詢中的結果很少,你應該去做。該流程以內部查詢首先執行並且結果集在外部查詢中使用的方式工作。 同時加入給你一個笛卡爾產品,這又是一個沉重的操作。

0

由於幾乎每個人都在說聯接會給我最佳的性能,我剛剛登錄說,我有完全相反的經歷。

所以有些日子,我寫了一個查詢數據量很大的3-4表。我用連接編寫了一個大型的sql查詢,執行它需要大約2-3個小時。然後我重構了它,創建了一個嵌套的select查詢,把儘可能多的約束放在嵌套的&中,使得它儘可能更嚴格,然後性能提高了> 90%,現在只需不到4分鐘即可運行。

這只是我的經驗,理論上可能會加入更好。我只是想分享我的經驗。更好地嘗試不同的事情,獲得​​關於表格的額外知識,它的索引等將有很大幫助。

更新:

而且我剛剛發現我做了什麼,在MySQL的這個優化基準頁面實際上是建議。 http://dev.mysql.com/doc/refman/5.6/en/optimizing-subqueries.html

粘貼在這裏爲快速參考:

替換子查詢的聯接。例如,試試這個:

SELECT DISTINCT column1 FROM t1 WHERE t1.column1 IN(SELECT column1 FROM t2);

代替此:

SELECT DISTINCT t1.column1 FROM T1,T2 WHERE t1.column1 = t2.column1;

將子句從外部移動到子查詢中。例如,使用 此查詢:

SELECT * FROM T1 WHERE S1 IN(SELECT S1從T1 UNION ALL SELECT S1 來自T2);代替這個查詢:

SELECT * FROM t1 WHERE s1 IN(SELECT s1 FROM t1)or s1 IN(SELECT s1 FROM t2);又如,使用此查詢:

SELECT(SELECT column1 + 5 FROM t1)FROM t2;代替這個查詢:

SELECT(SELECT column1 FROM t1)+ 5 FROM t2;