sql >> Databasteknik >  >> RDS >> Mysql

Vilken inner join sql är mest effektiv och bäst i mysql?

Alla dessa är funktionellt likvärdiga. Även separationen mellan WHERE-sats och JOIN-villkor kommer inte att ändra resultaten när man arbetar helt med INNER-kopplingar (det kan spela roll med OUTTER-kopplingar). Dessutom bör alla dessa arbeta ut i exakt samma frågeplan (effektivt noll prestandaskillnad). Ordningen som du inkluderar objekt spelar ingen roll . Frågemotorn är fri att optimera eftersom den passar bäst inom den funktionella specifikationen för frågan. Även när du identifierar specifikt beteende med avseende på ordning, bör du inte räkna med det. Specifikationen tillåter morgondagens patch för att ändra dagens beteende på detta område. Kom ihåg:hela poängen med SQL är att vara uppsättningsbaserad och deklarativ :du berättar för databasen vad du vill att det ska göra, inte hur du vill att den ska göra det.

Nu när korrekthet och prestanda är ur vägen, är vi nere på stilfrågor:saker som programmerarproduktivitet och läsbarhet/underhållbarhet av koden. I det avseendet är alternativ #4 i den listan överlägset det bästa valet, med #3 det näst bästa, särskilt när du börjar komma in på mer komplicerade frågor. Använd bara inte A,B syntax längre; det har varit föråldrat sedan 1992 års version av SQL-standarden. Skriv alltid ut hela INNER JOIN (eller LEFT JOIN /RIGHT JOIN /CROSS JOIN etc).

Allt som sagt, även om ordning spelar (eller åtminstone borde) ingen roll för prestanda, tycker jag att det är användbart när jag skriver SQL att använda en konvention i mitt tillvägagångssätt som dikterar ordningen. Detta hjälper mig att identifiera fel eller falska antaganden senare vid felsökning och felsökning. Den här allmänna guiden som jag försöker följa är att bete sig som om ordningen spelar någon roll, och sedan med det i åtanke försöka hålla den arbetsuppsättning av minne som behövs av databasen för att uppfylla frågan så liten som möjligt så länge som möjligt:börja med mindre bord först och gå sedan till de större; när du överväger tabellstorlek, ta hänsyn till villkor i WHERE-satsen som matchar ett index; föredra de inre skarvarna före de yttre när du har valet; lista anslutningsvillkor för att favorisera index (särskilt primära/klustrade nycklar) först, och andra villkor för sammanfogningen sedan.




  1. BLOB lagringslängd i orakel

  2. SQL Server-väntehändelser -1

  3. PostgreSQL Skapa index

  4. 4 typer av information att inkludera i din CRM-databas