Udførelses rækkefølgen i queries, LIMIT
Jeg er blevet rådgivet, sandsynligvis korrekt, om brug af LIMIT, men forklaringen gik på tværs af min egen, sandsynligvis fejlende, logik. Fordi jeg har lettere ved at gøre noget jeg forstår søger jeg hjælp til forståelse.Jeg har forstået, fra mit oprindelige SQL kursus for længe siden og fra googling her til morgen, at udførelses rækkefølgen af for eksempel en query med join mellem to tabeller (lad os sige Kunder og Ordrer,) logisk set, er denne:
Først dannes der, virtuelt, en tabel der kombinerer alle rækker af Kunder med alle rækker af Ordrer. Hvis Kunder har 5 kolonner og 25 rækker og Ordrer har 3 kolonner og 100 rækker får denne virtuelle tabel 8 kolonner og 2500 rækker.
Fra denne virtuelle tabel beholdes de rækker der passer med Join klausulen, for eksempel at Kunder.id = Ordrer.kundeId.
Derefter beholdes de rækker der passer med WHERE klausulen, for eksempel de hvor Kunder.id = 253. Og GROUP BY udføres hvis nødvendigt.
Når man så har de rigtige rækker, stadig med 8 kolonner, så beholdes de kolonner der svarer til SELECT klausulet.
Og til slut ORDER BY.
Men jeg har ikke kunnet finde noget om hvor LIMIT kommer ind. Min (igen muligvis fejlende) logik siger mig, at LIMIT må komme aller sidst. Hvis man beder om LIMIT 5 skulle man få de fem første rækker, ikke fem tilfældige rækker. LIMIT 5 svarer jo til TOP 5 i mssql og andre systemer. Og maskinen kan vel ikke vide hvilke rækker er de første før den har udført hele queryen og sorteret den efter ORDER BY.
Det modsatte synspunkt er, at når maskinen har fundet et tilstrækkeligt antal rækker, så stoppes videre udførelse. Et konkret eksempel er dette: Når en ny bruger vil oprette sig skal det undersøges om det valgte brugernavn allerede er brugt. Det kan gøres med
if(mysql_num_row(SELECT * FROM table WHERE username = $user)) //afbryd
else //fortsæt.
Det er naturligvis ligegyldigt om dette username findes 1 eller 10 gange. Jeg fik så at vide, at hvis jeg indsætter LIMIT 1, så afbrudes søgningen, så snart der er fundet et sådant username.
Kan en venlig sjæl hjælpe mig med at forstå udførelses rækkefølgen i mysql queries og hvor LIMIT kommer ind?