Indicizzazione di un database


12

Non ho molta familiarità con i database e ora sto cercando di capire il meccanismo di indicizzazione.

Da quello che so, in un RDBMS, l'indicizzazione su una colonna rende più veloce la ricerca per quella colonna. Questo vale anche per i negozi tripli, solo lì gli indici presuppongono che si cercherà (ad esempio) principalmente per soggetto, quindi per oggetto e così via.

Non sono sicuro di RDBMS, ma sui negozi tripli puoi definire più di un indice, lasciando che il negozio scelga l'indice migliore per ogni query (speriamo di aver capito bene). Naturalmente, appare la seguente domanda:

Perché non dovrei aggiungere tutti i possibili indici a un triplo archivio e estenderli a un RDBMS, perché non creare indici su ogni colonna (supponendo che non sia troppo pigro)?

Risposte:


25

Perché, in sostanza, un indice è una tabella aggiuntiva, in cui la chiave primaria è il campo che stai indicizzando e l'unico contenuto è la chiave primaria della tabella principale. Quindi ogni aggiornamento deve essere replicato in ogni indice che utilizza il campo che aggiorni.

Ciò è particolarmente evidente sugli inserti. Immagina se ogni inserto che hai fatto su una tabella dovesse essere replicato su altre 20 tabelle. Sarà dolorosamente lento.

Nota che questo peggiora ancora con gli indici composti, raggruppati e full-text, ma non voglio ancora complicarti il ​​problema.


2

Gli indici sono sostanzialmente strutture dati aggiuntive che devono essere costruite e archiviate. La costruzione di energia di CPU indebolita (durante le operazioni di scrittura) e la sua memorizzazione fa perdere capacità del disco.

Perché dovresti creare e archiviare indici che non usi mai?


È una domanda puramente teorica ("what if / why not").
Dragos,

@Dragos Penso che la risposta a questa domanda sia ovvia dal mio post: se lo facessi, ogni operazione di scrittura diventerebbe molto più lenta e ogni record sprecherebbe molta capacità del disco. Perchè no? Perché la potenza della CPU e l'archiviazione su disco sono costose.
Matěj Zábský,

2

Posizionare gli indici solo quando necessario. Come regola generale quando sto sviluppando uno schema di database, ogni tabella ottiene un indice cluster chiave primaria PK per iniziare. Questo sarà l'identificatore univoco per i dati in quella tabella. In può essere su 1 colonna o più.

Successivamente, di solito aggiungo solo gli indici univoci non cluster sulle colonne sulle quali desidero applicare l'univocità.

Questo è lo schema di base. Man mano che l'applicazione viene sviluppata e matura, aggiungiamo indici in base alle esigenze in base alle preoccupazioni relative alle prestazioni e al modo in cui eseguiamo la query dei dati.

Ogni indice aggiunto aumenta la spaziatura utilizzata e l'aggiunta di ulteriore manutenzione. Quindi scegli i tuoi indici con saggezza.


Mentre leggevo la tua risposta, mi è venuta in mente un'altra domanda: le chiavi primarie di solito vengono automaticamente indicizzate o devo specificare me stesso che verranno indicizzate? Ad esempio, dire in un database MySQL?
Dragos,

Sì, una chiave primaria dovrebbe creare automaticamente un indice cluster per il tuo (SQL Server). Solo una chiave primaria, quindi solo un indice cluster per tabella. MySQL dovrebbe essere simile ma forse un esperto MySQL può convalidare.
Jon Raynor,

2

Il punto di forza degli indici è che sono 1) una struttura di dati che può essere rapidamente cercata e 2) più compatta delle tabelle effettive, consentendo a più indice di adattarsi alla memoria anziché essere impaginato sul disco.

Se hai un indice su ogni colonna, gli indici stessi occuperanno più spazio della tabella che rappresentano. Se il database utilizza davvero tutti gli indici, richiederà più tempo solo per scambiarli dentro e fuori dalla memoria. Inoltre, ogni indice deve essere aggiornato su un inerte, aggiornamento o eliminazione.

Oltre a ciò, gli indici su una singola colonna non sono nemmeno il meglio che puoi fare. La maggior parte dei database delle relazioni in realtà consente un indice su più colonne e l'ordine di queste colonne è importante. Ad esempio, se voglio cercare in un database tutte le persone che sono andate a Duke dalle classi tra il 1980 e il 1984, allora quello che voglio è un indice su (Scuola, ClassYear). La query non sarebbe in grado di utilizzare un indice con le stesse colonne, ma al contrario.

Quindi, per creare ogni possibile indice, ci sono almeno n! modi per disporre le colonne in un indice. Con solo 5 colonne, ci sono 120 possibili indici.

Dato che ci sono così tanti indici possibili, devi davvero determinare quali indici sono utili per la tua applicazione e creare solo quelli.


Ma nel tuo esempio due indici: uno a scuola e l'altro su ClassYear sarebbero utili in nessuno dei casi?
Dragos,

@Dragos Certo, possono essere. Se avessi un'altra domanda che era solo durante l'anno scolastico (tutti gli studenti che frequentavano una scuola nella classe del 2004), l'indice per l'anno scolastico potrebbe essere utile. Sfortunatamente, ci sono molti fattori che il motore di query usa quando decide quale indice usare quando. Se si scopre che metà delle persone nel database sono andate a scuola nel 2004, allora il database potrebbe semplicemente ignorare l'indice ed eseguire comunque la scansione dell'intera tabella. Se vuoi diventare bravo in questo, inizia a utilizzare e leggere i piani di esecuzione
Chris Pitman,

Quello che volevo dire era, se avessi indici separati su School e ClssYear, sarebbero utili quando cercassi tutte le persone che andavano a Duke dalle lezioni tra il 1980 e il 1984?
Dragos,

@Dragos Dipende dal motore db specifico. Ad esempio, Postgres utilizzerà qualcosa chiamato Scansione indice bitmap per intersecare i risultati di più indici. Spetta al motore di query decidere quale indice utilizzare e questo sarà sempre specifico del db.
Chris Pitman,

2

La creazione di un indice per ogni colonna in una tabella di solito è uno spreco di spazio e, come altri hanno già detto, può rallentare le operazioni di inserimento / aggiornamento. Un indice viene utilizzato per accelerare le query. Ti consiglio di aggiungere un indice a una colonna solo se noti prestazioni scadenti quando esegui una query per i valori in quella colonna.

Alcuni database potrebbero richiedere un indice per la chiave primaria di una tabella, quindi potresti non avere scelta su quella. Inoltre, se hai colonne di testo molto grandi, ci sono tecnologie specifiche progettate per la ricerca e l'indice full-text, ma non sono sempre gli stessi tipi di indice che utilizzeresti per una piccola colonna numerica.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.