7.1 Ragioni per la comparsa degli indici

Un'altra cosa importante senza la quale non possono esistere database sono gli indici.

Immagina una situazione in cui ci sono 10 milioni di utenti nella tabella degli utenti e desideri visualizzare tutti coloro che hanno un livello superiore a 90. Questa query è molto semplice da scrivere:

SELECT * FROM user WHERE level > 90

Ottimo, abbiamo scritto la richiesta in meno di un minuto. E quanto tempo ci vorrà per eseguire questa query dal server SQL? Per eseguire una tale query, dovrà esaminare 10 milioni di record e, anche se esiste un solo record, ci vorrà molto tempo.

Come faremmo un'attività simile in Java? Per prima cosa ordineremmo la raccolta di utenti per livello, quindi potremmo trovare molto rapidamente i record necessari utilizzando una ricerca binaria. Spero di non aver bisogno di spiegare cos'è?

Ottimo, ma cosa succede se ora dobbiamo selezionare gli utenti la cui data di registrazione è precedente al 2020? Ordina nuovamente per data di registrazione e utilizza la ricerca binaria.

Sì, se eseguiamo un filtro su un campo, e non solo una volta, ma spesso, sarà molto utile archiviare i dati ordinati per questo campo.

E come archiviare i dati ordinati contemporaneamente per campi diversi?

E la risposta è molto semplice: non è necessario memorizzare i dati stessi, ma i loro indici in una tabella globale.

Diciamo che ci sono 10 utenti con id: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}.

E decidi di ordinarli per livello, quindi l'array del loro id sarà, ad esempio, così: {9, 2, 3, 1, 5, 4, 8, 6, 7, 10}.

E se li ordiniamo per data, otteniamo, ad esempio: {10, 1, 8, 7, 2, 3, 5, 9, 6}.

Gli array di questi id sono chiamati indexes . Gli elementi stessi sono grandi, non li tocchiamo. In Java, non tocchiamo gli oggetti, ma memorizziamo i loro riferimenti; in SQL, non tocchiamo stringhe reali, ma memorizziamo i loro numeri.

Fammi riscrivere questo in codice Java:

List<String> list = List.of("A", "C", "B", "Z", "Cc", "Bb", "Zz", "Y");  //this is a list of objects
List<String> alphabeticsList = new ArrayList(list);
Collections.sort(alphabeticsList); //collection sorted alphabetically

List<String> lengthList = new ArrayList(list);
Collections.sort(lengthList, lengthComparator); //collection sorted by string length

Ordinare le raccolte non significa spostare gli elementi veri e propri. La collezione non memorizza oggetti reali, ma si collega ad essi. Lo stesso vale per le tabelle SQL. Le vere linee mentono a se stesse e mentono.

E quando dobbiamo effettuare selezioni frequenti per alcuni campi, aggiungiamo un altro indice alla tabella (analogo a una nuova raccolta in Java) e ordiniamo le righe della tabella, memorizziamo il loro ordinamento in uno speciale file di indice.

Spero che il confronto Java abbia aiutato un po'. Un po' di pratica - e per te l'uso degli indici diventerà anche la soluzione più ovvia.

7.2 Aggiunta di indici a una tabella

L'indice può essere specificato immediatamente durante la creazione della tabella o aggiunto successivamente. Molto spesso, è il secondo scenario che si verifica: gli indici vengono aggiunti man mano che la dimensione della tabella aumenta e il campionamento dei dati rallenta.

Aggiungere un indice a una tabella è molto semplice:

ALTER TABLE table
    ADD INDEX index_name (column);

Se cerchi spesso record in più colonne contemporaneamente, puoi specificare un indice composto: SQL utilizza più colonne per comporlo.

Anche l'aggiunta di un indice composito a una tabella è molto semplice:

ALTER TABLE table
    ADD INDEX index_name (column 1, column 2, column 3, ...);

Gli indici occupano molto spazio su disco, quindi se non hai più bisogno di un indice, puoi sempre rimuoverlo:

ALTER TABLE table
    DROP INDEX index_name;

Gli indici stessi sono una parte piuttosto nascosta del database. Non influiscono in alcun modo sul formato di scrittura delle query. È solo che la loro presenza accelera il campionamento dei dati e ne rallenta l'aggiunta e il backup.

Ma considerando quanto sia importante la velocità nel mondo di oggi e quanto sia economico lo spazio su disco, sentiti libero di aggiungere indici per tutte le occasioni. Perdonatemi amministratori...