Gli indici possono svolgere un ruolo importante nell'ottimizzazione delle query e nella ricerca rapida dei risultati nelle tabelle. Quindi è il passaggio più importante selezionare le colonne da indicizzare. Ci sono due punti principali in cui possiamo considerare l'indicizzazione: colonne a cui si fa riferimento nella clausola WHERE e colonne utilizzate nelle clausole JOIN. In breve, tali colonne dovrebbero essere indicizzate rispetto alle quali è necessario cercare particolari record. Supponiamo di avere una tabella denominata acquirenti in cui la query SELECT utilizza indici come di seguito:
SELECT
buyer_id /* no need to index */
FROM buyers
WHERE first_name='Tariq' /* consider to use index */
AND last_name='Iqbal' /* consider to use index */
Poiché "buyer_id" è referenziato nella parte SELECT, MySQL non lo userà per limitare le righe scelte. Quindi, non è necessario indicizzarlo. Il seguente è un altro esempio leggermente diverso da quello sopra:
SELECT
buyers.buyer_id, /* no need to index */
country.name /* no need to index */
FROM buyers LEFT JOIN country
ON buyers.country_id=country.country_id /* consider to use index */
WHERE
first_name='Tariq' /* consider to use index */
AND
last_name='Iqbal' /* consider to use index */
In base alle query precedenti first_name, le colonne last_name possono essere indicizzate poiché si trovano nella clausola WHERE. Anche un campo aggiuntivo, country_id dalla tabella country, può essere considerato per l'indicizzazione perché si trova in una clausola JOIN. Quindi l'indicizzazione può essere considerata su ogni campo nella clausola WHERE o in una clausola JOIN.
Il seguente elenco offre anche alcuni suggerimenti che dovresti sempre tenere a mente quando intendi creare indici nelle tue tabelle:
- Indicizza solo le colonne richieste nelle clausole WHERE e ORDER BY. L'indicizzazione delle colonne in abbondanza comporterà alcuni svantaggi.
- Prova a trarre vantaggio dalla funzionalità "prefisso indice" o "indice a più colonne" di MySQL. Se crei un indice come INDEX (first_name, last_name), non creare INDEX (first_name). Tuttavia, "prefisso indice" o "indice a più colonne" non è consigliato in tutti i casi di ricerca.
- Utilizzare l'attributo NOT NULL per quelle colonne in cui si considera l'indicizzazione, in modo che i valori NULL non vengano mai memorizzati.
- Utilizza l'opzione --log-long-format per registrare le query che non utilizzano gli indici. In questo modo, puoi esaminare questo file di registro e modificare le tue query di conseguenza.
- L'istruzione EXPLAIN ti aiuta a rivelare il modo in cui MySQL eseguirà una query. Mostra come e in quale ordine le tabelle vengono unite. Questo può essere molto utile per determinare come scrivere query ottimizzate e se le colonne devono essere indicizzate.
Aggiornamento (23 febbraio 15):
Qualsiasi indice (buono / cattivo) aumenta il tempo di inserimento e aggiornamento.
A seconda dei tuoi indici (numero di indici e tipo), il risultato viene cercato. Se il tempo di ricerca aumenterà a causa dell'indice, allora non sarà indice.
Probabilmente in qualsiasi libro, "Pagina indice" potrebbe avere la pagina iniziale del capitolo, l'inizio del numero della pagina dell'argomento e anche l'inizio della pagina dell'argomento secondario. Alcuni chiarimenti nella pagina Indice aiutano, ma un indice più dettagliato potrebbe confonderti o spaventarti. Anche gli indici hanno memoria.
La selezione dell'indice dovrebbe essere saggia. Tieni presente che non tutte le colonne richiederebbero index.