La vera domanda è: questi record hanno una relazione uno a uno o una relazione uno a molti ?
Risposta TLDR:
Se uno a uno, usa JOIN
un'istruzione.
Se uno-a-molti, usa una (o molte) SELECT
istruzioni con l'ottimizzazione del codice lato server.
Perché e come utilizzare SELECT per l'ottimizzazione
SELECT
'ing (con più query invece di join) su un grande gruppo di record basato su una relazione uno-a-molti produce un'efficienza ottimale, in quanto JOIN
ha un problema esponenziale di perdita di memoria. Prendi tutti i dati, quindi usa un linguaggio di scripting lato server per risolverli:
SELECT * FROM Address WHERE Personid IN(1,2,3);
risultati:
Address.id : 1 // First person and their address
Address.Personid : 1
Address.City : "Boston"
Address.id : 2 // First person's second address
Address.Personid : 1
Address.City : "New York"
Address.id : 3 // Second person's address
Address.Personid : 2
Address.City : "Barcelona"
Qui, sto ottenendo tutti i record, in una dichiarazione selezionata. Questo è meglio di JOIN
, che sarebbe sempre un piccolo gruppo di questi record, uno alla volta, come un sub-componente di un altro query. Quindi lo analizzo con un codice lato server che assomiglia a ...
<?php
foreach($addresses as $address) {
$persons[$address['Personid']]->Address[] = $address;
}
?>
Quando non usare JOIN per l'ottimizzazione
JOIN
'ing un grande gruppo di record basato su una relazione uno a uno con un singolo record produce un'efficienza ottimale rispetto a più SELECT
istruzioni, una dopo l'altra, che ottengono semplicemente il tipo di record successivo.
Ma JOIN
è inefficiente quando si ottengono record con una relazione uno-a-molti.
Esempio: il database Blog ha 3 tabelle di interesse, Blogpost, Tag e Comment.
SELECT * from BlogPost
LEFT JOIN Tag ON Tag.BlogPostid = BlogPost.id
LEFT JOIN Comment ON Comment.BlogPostid = BlogPost.id;
Se ci sono 1 post sul blog, 2 tag e 2 commenti, otterrai risultati come:
Row1: tag1, comment1,
Row2: tag1, comment2,
Row3: tag2, comment1,
Row4: tag2, comment2,
Notare come ogni record viene duplicato. Bene, quindi, 2 commenti e 2 tag sono 4 righe. Cosa succede se abbiamo 4 commenti e 4 tag? Non ottieni 8 righe - ottieni 16 righe:
Row1: tag1, comment1,
Row2: tag1, comment2,
Row3: tag1, comment3,
Row4: tag1, comment4,
Row5: tag2, comment1,
Row6: tag2, comment2,
Row7: tag2, comment3,
Row8: tag2, comment4,
Row9: tag3, comment1,
Row10: tag3, comment2,
Row11: tag3, comment3,
Row12: tag3, comment4,
Row13: tag4, comment1,
Row14: tag4, comment2,
Row15: tag4, comment3,
Row16: tag4, comment4,
Aggiungi più tabelle, più record, ecc. E il problema si gonfia rapidamente in centinaia di righe che sono tutte piene di dati prevalentemente ridondanti.
Quanto ti costano questi duplicati? Memoria (nel server SQL e il codice che tenta di rimuovere i duplicati) e risorse di rete (tra il server SQL e il server del codice).
Fonte: https://dev.mysql.com/doc/refman/8.0/en/nested-join-optimization.html ; https://dev.mysql.com/doc/workbench/en/wb-relationship-tools.html