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

In mysql quale inner join sql è più efficace e migliore?

Tutti quelli sono funzionalmente equivalenti. Anche la separazione tra la clausola WHERE e la condizione JOIN non cambierà i risultati quando si lavora interamente con i join INNER (può avere importanza con i join OUTER). Inoltre, tutti questi dovrebbero funzionare nello stesso identico piano di query (differenza di prestazioni effettivamente zero). L'ordine in cui includi gli elementi non ha importanza . Il motore di query è libero di ottimizzare come meglio si adatta alle specifiche funzionali della query. Anche quando identifichi un comportamento specifico per quanto riguarda l'ordine, non dovresti fare affidamento su di esso. La specifica consente alla patch di domani di modificare il comportamento odierno in quest'area. Ricorda:il punto centrale di SQL deve essere basato su set e dichiarativo :dici al database cosa vuoi che avvenga, non come vuoi che lo faccia.

Ora che la correttezza e le prestazioni sono fuori mano, si tratta di questioni di stile:cose come la produttività del programmatore e la leggibilità/manutenibilità del codice. A questo proposito, l'opzione n. 4 in quell'elenco è di gran lunga la scelta migliore, con il numero 3 il migliore successivo, soprattutto quando inizi a entrare in query più complicate. Basta non usare il A,B sintassi più; è obsoleto dalla versione del 1992 dello standard SQL. Scrivi sempre il INNER JOIN completo (o LEFT JOIN /RIGHT JOIN /CROSS JOIN ecc).

Detto questo, mentre l'ordine non ha importanza (o, almeno, dovrebbe) non ha importanza per le prestazioni, trovo utile quando scrivo SQL per utilizzare una convenzione nel mio approccio che detta l'ordine. Questo mi aiuta a identificare errori o false ipotesi in un secondo momento durante il debug e la risoluzione dei problemi. Questa guida generale che provo a seguire è di comportarmi come se l'ordine fosse importante, quindi con questo in mente cerca di mantenere il set di lavoro di memoria necessario al database per soddisfare la query il più piccolo possibile il più a lungo possibile:inizia prima con i tavoli più piccoli e poi unisciti a quelli più grandi; quando si considera la dimensione della tabella, tenere conto delle condizioni nella clausola WHERE che corrispondono a un indice; preferisci le giunture interne prima di quelle esterne quando hai la possibilità di scegliere; elenca le condizioni di join per favorire prima gli indici (soprattutto chiavi primarie/cluster) e poi altre condizioni sul join.