Spesso nello sviluppo di applicazioni, sia web che non, è necessario appoggiarsi ad una base di dati. Una buona progettazione del database è talvolta fondamentale per ottenere buone prestazioni, sia per quanto riguarda la scrittura del codice, sia per quanto riguarda l’applicazione in sè.
Prendiamo per esempio la tabella impiegati(id,cognome,nome,eta,dipartimento_id) e la tabella dipartimenti(id, nome_dipartimento,sede).
Se volessimo ottenere la lista degli impiegati il cui dipartimento ha, per esempio, sede a Roma, potremmo scrivere diverse query SQL che ci fanno ottenere lo stesso risultato:
SELECT i.* FROM impiegati i,dipartimenti d WHERE i.dipartimento_id = d.id AND d.sede = 'Roma'; SELECT * FROM impiegati WHERE dipartimento_id IN (SELECT id FROM dipartimenti WHERE sede = 'Roma'); SELECT i.* FROM impiegati i INNER JOIN dipartimenti d ON i.dipartimento_id = d.id WHERE d.sede = 'Roma';
Tra le precedenti query l’ultima ha prestazioni decisamente migliori anche se è la più lunga da scrivere:
nel primo caso il DBMS deve prima effettuare un prodotto cartesiano tra le due tabelle ed estrarre i record dove corrispondono gli ID dei dipartimenti e la sede è Roma;
nel secondo caso il DBMS prima leggere tutti i dipartimenti con sede = ‘Roma’ e per ogni impiegato verificare che dipartimento_id sia in questa lista.
Nel terzo caso invece il DBMS automaticamente associa ogni impiegato con il dipartimento relativo e la ricerca sarà effettuata solo sul campo “sede”.
L’uso di INNER JOIN velocizza le vostre applicazioni, ma usatelo con cautela: i valori nulli sui campi su cui si effettua il JOIN non sono ammessi.
Se ve n’é la necessità si possono utilizzare LEFT e RIGHT JOIN.
Se per esempio vogliamo sapere i cognomi degli impiegati che lavorano a Roma o che non lavorano (= dipartimento_id IS NULL) dovremmo scrivere:
SELECT i.cognome FROM impiegati i LEFT JOIN dipartimenti d ON i.dipartimento_id = d.id WHERE sede = 'Roma' OR i.dipartimento_id IS NULL;
La scrittura delle INNER JOIN può diventare molto ripetitiva, soprattutto se vengono usate spesso. L’uso per di convenzioni però ci può dare una mano. Ridefiniamo le tabelle di prima in questo modo:
impiegati (impiegato_id, cognome, nome, eta, dipartimento_id) dipartimenti (dipartimento_id, sede)
Con le tabelle definite in questa guisa possiamo sfoderare un ulteriore tipo di JOIN: il NATURAL JOIN.
Il natural join utilizza campi con lo stesso nome per effettuare la combinazione dei record delle tabelle. Quindi se volessimo sapere quali impiegati lavorano a Roma, la nostra query SQL diventa:
SELECT i.* FROM impiegati i NATURAL JOIN dipartimenti d WHERE d.sede = 'Roma';
Praticamente il NATURAL JOIN funziona esattamente come l’INNER JOIN, solo che ci fa risparmiare la scrittura di ON i.dipartimento_id = d.dipartimento_id, mantenendo inalterate le prestazioni.
Quindi scegliendo bene i nomi dei campi possiamo scrivere query più veloci e più velocemente.
Ovviamente le prestazione delle JOIN aumentano in presenza di INDICI. Il miglior tipo di indice per effettuare un join è HASH, non implementato purtroppo da MySQL (almeno per quanto riguarda InnoDB e MyISAM).
Infatti un indice implementato tramite HASH ha prestazioni migliori rispetto a BTREE se la ricerca viene effettuata in base a delle uguaglianze.
Gli indici BTREE invece hanno migliori prestazione in ricerche basate su range, come ad esempio nella query:
SELECT * FROM impiegati WHERE eta > 30
Un indice BTREE sul campo “eta” migliorerebbe le prestazione della vostra query.



0 Comments
There are no comments yet...Kick things off by filling out the form below.
Leave a Comment