1

次の 2 つの SQL ステートメントは同じ結果を返しますが、最初のステートメントは 2 番目のステートメントよりもはるかに遅くなります。

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 句が適用され、2 番目のステートメントでは正反対のように見えます。しかし、すべての DB エンジンで同じように動作しますか (MySQL でテストしました)?

DB エンジンが fors one のようなクエリを最適化し、最初に WHERE 句を適用してから結合できることを期待していました。

4

2 に答える 2

0

いつでも結合をネストされたクエリに置き換えることができます...常に高速ですが、面倒です...

于 2013-08-12T00:55:29.733 に答える