Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Há algo de errado com as junções que não usam a palavra-chave JOIN no SQL ou no MySQL?


Filtrando junções usando apenas WHERE pode ser extremamente ineficiente em alguns cenários comuns. Por exemplo:
SELECT * FROM people p, companies c 
    WHERE p.companyID = c.id AND p.firstName = 'Daniel'

A maioria dos bancos de dados executará essa consulta literalmente, primeiro usando o produto cartesiano das people e companies tabelas e depois filtrando por aqueles que têm companyID correspondente e id Campos. Embora o produto totalmente irrestrito não exista em nenhum lugar a não ser na memória e apenas por um momento, seu cálculo leva algum tempo.

Uma abordagem melhor é agrupar as restrições com o JOIN s quando relevante. Isso não é apenas subjetivamente mais fácil de ler, mas também muito mais eficiente. Assim:
SELECT * FROM people p JOIN companies c ON p.companyID = c.id
    WHERE p.firstName = 'Daniel'

É um pouco mais longo, mas o banco de dados é capaz de ver o ON cláusula e use-a para calcular o JOIN totalmente restrito diretamente, em vez de começar com tudo e, em seguida, limitando para baixo. Isso é mais rápido de calcular (especialmente com grandes conjuntos de dados e/ou junções de muitas tabelas) e requer menos memória.

Eu mudo todas as consultas que vejo que usam a "vírgula JOIN " sintaxe. Na minha opinião, o único propósito para sua existência é a concisão. Considerando o impacto no desempenho, não acho que isso seja uma razão convincente.