Mysql
 sql >> Database >  >> RDS >> Mysql

C'è qualcosa di sbagliato nei join che non utilizzano la parola chiave JOIN in SQL o MySQL?

Filtraggio dei join utilizzando esclusivamente WHERE può essere estremamente inefficiente in alcuni scenari comuni. Ad esempio:

SELECT * FROM people p, companies c 
    WHERE p.companyID = c.id AND p.firstName = 'Daniel'

La maggior parte dei database eseguirà questa query in modo abbastanza letterale, prendendo prima il prodotto cartesiano delle people e companies tabelle e poi filtrando per quelli che hanno companyID corrispondente e id campi. Anche se il prodotto completamente non vincolato non esiste da nessuna parte ma nella memoria e quindi solo per un momento, il suo calcolo richiede del tempo.

Un approccio migliore consiste nel raggruppare i vincoli con JOIN s se pertinente. Questo non è solo soggettivamente più facile da leggere, ma anche molto più efficiente. Quindi:

SELECT * FROM people p JOIN companies c ON p.companyID = c.id
    WHERE p.firstName = 'Daniel'

È un po' più lungo, ma il database è in grado di guardare ON e usala per calcolare il JOIN completamente vincolato direttamente, invece di iniziare con tutto e poi limitandoci. È più veloce da calcolare (soprattutto con set di dati di grandi dimensioni e/o join di molte tabelle) e richiede meno memoria.

Cambio ogni query che vedo che utilizza la "virgola JOIN " sintassi. Secondo me, l'unico scopo della sua esistenza è la concisione. Considerando l'impatto sulle prestazioni, non credo che questo sia un motivo convincente.