這兩個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子句,然後進行連接。
*您威力*能夠得到一個更好的答案對HTTP這樣一個問題://dba.stackexchange。 com/ – ean5533
你是否也在oracle下試過這個? – Sebas
不幸的是沒有,但我真的很想,因爲我很確定oracle會正確地優化它。其實這是我的問題的目的 - 是這種行爲特定於MySQL或在所有引擎上有效。 – mnowotka