Come Funzionano gli Indici MySQL

Chiunque abbia mai creato una tabella e scritto un paio di query avrà avuto a che fare con gli indici.
Sapere maneggiare questa struttura e scrivere le query nel modo adatto a sfruttarli può fare la differenza tra un’attesa infinita per avere un risultato e una risposta rapida.

Gli indici, come dicevamo, sono strutture interne a sè stanti rispetto alle tabelle ma che fanno riferimento – potremmo dire che sono di supporto – alle stesse.
Senza scendere nei dettagli implementativi (ogni DBMS fa a sè), gli indici hanno lo scopo di velocizzare l’accesso ai dati contenuti in una tabella. Scorrendo l’indice, il DBMS non deve leggerne l’intero contenuto.
Ciò non significa che indicizzando tutti i campi di una tabella si ottengano benefici, ma solo che si occuperà un sacco di spazio su disco rallentando anche le query più banali.

È bene tenere a mente che la creazione degli indici su una tabella già popolata necessita di tempo di elaborazione e di risorse, per contro, una volta che l’indice (o gli indici) sono stati creati, ogni inserimento/cancellazione/modifica dei record della tabella comporterà del lavoro aggiuntivo per l’aggiornamento da parte del DBMS.
In caso di lunghe elaborazioni con molte modifiche può avere senso cancellare gli indici all’inizio e ricrearli alla fine.

La creazione di un indice è consigliata su quelle colonne che vengono usate spesso nelle condizioni (WHERE clause) o negli ordinamenti (ORDER BY). Per gli indici normali non è necessario che i valori contenuti siano univoci.
Gli indici univoci (UNIQUE), invece, possono essere creati solo su quelle colonne il cui contenuto sarà diverso per ogni record. Per questo motivo, una volta creato l’indice, sarà vietato l’inserimento di record il cui campo indicizzato ha lo stesso valore di un record già presente in tabella.
Le chiavi primarie sono indici UNIQUE e PRIMARY.
Gli indici combinati (INDEX(campo_1, campo_2)) sono molto utili nel caso in cui si facciano spesso interrograzioni su due campi precisi, WHERE campo_1=123 AND campo_2=456, per esempio.

Piccoli trucchi
-se si usano delle funzioni sul campo indicizzato l’indice non può essere usato;
-l’indice non si sfrutta se si usa l’operatore !=;
-gli indici hanno senso solo se i valori da indicizzare sono diversi tra loro;
-nei LIKE le wildcard vanno messe in fondo o non si possono sfruttare gli indici (LIKE ‘abc%’ al posto di LIKE ‘%abc%’);
-nelle query su indici combinati l’ordine aiuta: INDEX(campo_1, campo_2) viene usato con WHERE campo_1=123, anche senza la condizione su campo_2, se ci fosse la condizione solo su campo_2 invece non verrebbe usato.

Ovviamente l’argomento non è esaurito qui con questo brevissimo post, sono solo piccole cose che possono fare la differenza.