MySQL: quale join è meglio tra il join esterno sinistro e il join interno


10

Quale join è peforming migliore se tutti forniscono lo stesso risultato? Ad esempio, ho due tavoli employees(emp_id,name, address, designation, age, sex)e work_log(emp_id,date,hours_wored). Per ottenere alcuni risultati specifici entrambi inner joine left joindà lo stesso risultato. Tuttavia, ho ancora alcuni dubbi che non si limitano solo a questa domanda.

  • quale join è più efficiente quale dovrebbe preferire in caso di stessi valori di risultato?
  • Quali sono gli altri fattori che devono essere considerati al momento della richiesta di adesione?
  • Esiste una relazione tra join interno e cross join?

Risposte:


14

Non esiste un tipo di join "migliore" o "peggiore". Hanno un significato diverso e devono essere utilizzati a seconda di esso.

Nel tuo caso, probabilmente non hai dipendenti senza work_log (nessuna riga in quella tabella), quindi LEFT JOINe JOINsarà equivalente nei risultati. Tuttavia, se avessi una cosa del genere (un nuovo dipendente senza registro_lavoro registrato), un JOINwold omettere quell'impiegato , mentre un'unione sinistra (la cui prima tabella è impiegati) mostrerebbe tutti loro, e null sui campi da work_log se ci non sono partite.

Spiegazione visiva dei tipi di JOIN

Ancora una volta, le prestazioni sono una cosa secondaria per interrogare la correttezza. Alcune persone dicono che non dovresti usare LEFT JOINs. È vero che un JOIN SINISTRA forza l'ottimizzatore a eseguire la query in un ordine particolare, impedendo in alcuni casi alcune ottimizzazioni (riordino delle tabelle). Ecco un esempio . Ma non dovresti scegliere l'uno sull'altro se la correttezza / il significato sono sacrificati, poiché un INNER JOIN non è intrinsecamente peggio. Il resto delle solite ottimizzazioni si applicano come al solito.

In sintesi, non usare LEFT JOINse intendi davvero INNER JOIN.

In MySQL CROSS JOIN, INNER JOINe JOINsono gli stessi. Nello standard e semanticamente, a CROSS JOINè una INNER JOINsenza ONclausola, in modo da ottenere ogni combinazione di righe tra le tabelle.

Hai esempi di tutti i tipi semantici di join su Wikipedia . In pratica, in MySQL, tendiamo solo a scrivere JOINe LEFT JOIN.


1
Spiegazione Gr8 @jynus. È una fortuna che io abbia ricevuto risposta alla mia domanda solo da te.
ursitesion il

1 grafico rilevante è migliore di 1000 parole. Ce l'hai fatta?
Fr0zenFir

No, non l'ho fatto, l'attribuzione è in fondo all'immagine codeproject.com/Articles/33052/… - Sebbene l'uso dei diagrammi di Venn per rappresentare i join sia vecchio quanto la sua formalizzazione algebrica: en.wikipedia.org/wiki/Relational_algebra
jynus,

Ho iniziato con una serie di commenti, poi mi sono reso conto che tutto si riduce a - dipende dalla tua domanda. +1 da me!
iheanyi,


0

Quale join ha prestazioni migliori se tutti forniscono lo stesso risultato?

Aggiungo la risposta precedente, per quello che so, MySQL è ottimizzato per avere le stesse prestazioni.

Con buoni indici, ad esempio, JOINvs LEFT JOIN+ WHEREclausola da filtrare, sarà la stessa cosa. Ottimizzazione vs Lettura umana ha senso su grandi query con molti join.

L'uso di buoni indici e cache è più importante.

Puoi leggere una buona spiegazione del processo di ottimizzazione qui:

Il processo di ottimizzazione delle query : una query può spesso essere eseguita in molti modi diversi e produrre lo stesso risultato. Il lavoro dell'ottimizzatore è trovare l'opzione migliore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.