sql >> Database >  >> RDS >> Mysql

Is er iets mis met joins die het JOIN-sleutelwoord in SQL of MySQL niet gebruiken?

Deelnames filteren uitsluitend met WHERE kan in sommige veelvoorkomende scenario's extreem inefficiënt zijn. Bijvoorbeeld:

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

De meeste databases zullen deze zoekopdracht vrij letterlijk uitvoeren, eerst met het Cartesian product van de people en companies tabellen en vervolgens filteren op die met overeenkomende companyID en id velden. Hoewel het volledig onbeperkte product nergens anders bestaat dan in het geheugen en dan slechts voor een moment, kost de berekening ervan enige tijd.

Een betere benadering is om de beperkingen te groeperen met de JOIN s waar relevant. Dit is niet alleen subjectief gemakkelijker te lezen, maar ook veel efficiënter. Dus:

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

Het is iets langer, maar de database kan kijken naar de ON clausule en gebruik deze om de volledig beperkte JOIN . te berekenen direct, in plaats van te beginnen met alles en dan naar beneden begrenzen. Dit is sneller te berekenen (vooral met grote datasets en/of veel-tabel-joins) en vereist minder geheugen.

Ik verander elke query die ik zie die gebruik maakt van de "komma JOIN " syntaxis. Naar mijn mening is beknoptheid het enige doel van het bestaan ​​ervan. Gezien de impact op de prestaties, denk ik niet dat dit een dwingende reden is.



  1. SQL Server verbinden met PostgreSQL

  2. Wat is de meest aanbevolen manier om tijd op te slaan in PostgreSQL met Java?

  3. SQL CASE:ken en vermijd 3 minder bekende problemen

  4. Teruggegeven record beperken van SQL-query in Oracle