次の 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 句を適用してから結合できることを期待していました。