2012-06-06 90 views
1

這兩個SQL語句返回相同的結果,但第一個比第二慢得多:SQL連接VS嵌套查詢

SELECT leading.email, kstatus.name, contacts.status 
FROM clients 
JOIN clients_leading ON clients.id_client = clients_leading.id_client 
JOIN leading ON clients_leading.id_leading = leading.id_leading 
JOIN contacts ON contacts.id_k_p = clients_leading.id_group 
JOIN kstatus on contacts.status = kstatus.id_kstatus 
WHERE (clients.email = 'some_email' OR clients.email1 = 'some_email') 
ORDER BY contacts.date DESC; 



SELECT leading.email, kstatus.name, contacts.status 
FROM (
    SELECT * 
    FROM clients 
    WHERE (clients.email = 'some_email' OR clients.email1 = 'some_email') 
    ) 
AS clients 
JOIN clients_leading ON clients.id_client = clients_leading.id_client 
JOIN leading ON clients_leading.id_leading = leading.id_leading 
JOIN contacts ON contacts.id_k_p = clients_leading.id_group 
JOIN kstatus on contacts.status = kstatus.id_kstatus 
ORDER BY contacts.date DESC; 

但我不知道爲什麼會這樣呢?它看起來像在firt語句中,首先完成連接,然後應用WHERE子句,而第二個則恰恰相反。但是它在所有數據庫引擎上的行爲方式(我在MySQL上測試過它)會如何?

我期待數據庫引擎可以優化查詢,比如fors one和fir應用WHERE子句,然後進行連接。

+2

*您威力*能夠得到一個更好的答案對HTTP這樣一個問題://dba.stackexchange。 com/ – ean5533

+0

你是否也在oracle下試過這個? – Sebas

+0

不幸的是沒有,但我真的很想,因爲我很確定oracle會正確地優化它。其實這是我的問題的目的 - 是這種行爲特定於MySQL或在所有引擎上有效。 – mnowotka

回答

2

有很多不同的原因,這可能是(鍵控等),但你可以看看explain MySQL命令,看看如何執行語句。如果你可以運行它,如果它仍然是一個謎。

0

您可以隨時更換嵌套查詢加入...它總是更快,但很多亂七八糟的......

+1

您的答案被標記爲低質量。您是否願意張貼參考資料/信息來證實您的建議?沒有細節或例子,下一次將刪除這樣一個無用的答案。 –

+0

好的,沒有問題我儘量在有空的時候儘量帶上我的測試和資源......我知道我的答案應該在評論時候是這樣簡短的...... :-( –

+0

感謝您的輸入!參考文獻I谷歌搜索和搜索似乎傾向於另一種方式,但我們重視您的參與,並且一般喜歡看到強大的支持細節。 –