Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Quali colonne generalmente creano buoni indici?

Gli indici possono svolgere un ruolo importante nell'ottimizzazione delle query e nella ricerca rapida dei risultati dalle tabelle. Quindi è molto importante selezionare le colonne da indicizzare. Ci sono due punti principali in cui possiamo considerare l'indicizzazione:le colonne a cui si fa riferimento nella clausola WHERE e le colonne utilizzate nelle clausole JOIN. In breve, tali colonne dovrebbero essere indicizzate rispetto alle quali è necessario eseguire ricerche in determinati 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 utilizzerà per limitare le righe scelte. Quindi, non è necessario indicizzarlo. Quello che segue è 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 paese, può essere considerato per l'indicizzazione perché è in una clausola JOIN. Quindi l'indicizzazione può essere considerata su ogni campo della clausola WHERE o di 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.
  • Cerca di sfruttare la funzionalità "prefisso indice" o "indice multicolonne" 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.
  • Utilizza l'attributo NOT NULL per quelle colonne in cui consideri l'indicizzazione, in modo che i valori NULL non vengano mai archiviati.
  • 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 adattare le tue query di conseguenza.
  • L'istruzione EXPLAIN ti aiuta a rivelare come MySQL eseguirà una query. Mostra come e in quale ordine vengono unite le tabelle. 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), viene cercato il risultato. Se il tempo di ricerca aumenterà a causa dell'indice, allora è un indice errato.

Probabilmente in qualsiasi libro, "Pagina indice" potrebbe avere la pagina iniziale del capitolo, l'inizio del numero della pagina dell'argomento, anche la 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 l'indice.