2012-06-06 30 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谷歌搜索和搜索似乎倾向于另一种方式,但我们重视您的参与,并且一般喜欢看到强大的支持细节。 –