这两个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