1

这两个 SQL 语句返回相同的结果,但第一个比第二个慢得多:

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;

但我想知道为什么会这样?看起来在第一个语句中首先完成连接,然后应用 WHERE 子句,而第二个则正好相反。但它在所有数据库引擎上的行为方式是否相同(我在 MySQL 上测试过)?

我期待数据库引擎可以优化像 fors one 和 fir apply WHERE 子句这样的查询,然后进行连接。

4

2 回答 2

2

这可能有很多不同的原因(键控等),但您可以查看explain mysql 命令以了解语句是如何执行的。如果您可以运行它并且它仍然是一个谜,请发布它。

于 2012-06-06T13:06:11.577 回答
0

你总是可以用嵌套查询替换连接......它总是更快但很混乱......

于 2013-08-12T00:55:29.733 回答