I dati in un database MySQL/MariaDB sono archiviati in tabelle. Un modo semplice di pensare agli indici è immaginare un foglio di calcolo esteso. Questo tipo di sistema non è sempre favorevole alla ricerca rapida; è qui che un indice diventa essenziale. Se non è presente alcun indice, il motore di database deve iniziare dalla riga uno e sfogliare tutte le righe alla ricerca dei valori corrispondenti. Se questa è una tabella piccola, non è un grosso problema, ma in tabelle e applicazioni più grandi in cui possono esserci tabelle con milioni e persino miliardi di righe, diventa problematico. Come puoi immaginare, cercare tra quelle righe una per una richiederà molto tempo, anche sull'hardware più recente. La soluzione è creare un INDICE (o più di uno) per i tuoi dati.
Cos'è un indice?
Un indice è una tabella di ricerca organizzata che contiene i puntatori a dove è possibile recuperare i dati nel database. Questo concetto è simile agli indici dei libri. In un libro, l'indice elenca i numeri di pagina in cui si trovano vari argomenti. In un database, l'indice memorizza i puntatori in un ordine logico e ordinato, consentendo ricerche rapide nel database. Immagina un libro senza un indice. Se vuoi cercare informazioni su un argomento specifico, devi iniziare dall'inizio e sfogliare le pagine fino a trovare le informazioni che stai cercando. Un indice di un libro risolve questo problema dicendoti esattamente quali pagine sono le informazioni che stai cercando. Questo è essenzialmente il modo in cui funziona un indice MySQL.
Quando MySQL utilizza gli indici?
Ogni volta che il server di database deve cercare informazioni, utilizzerà un indice per accelerare il processo. Esempi di ciò includono le clausole WHERE, JOIN ON, MIN/MAX e ORDER BY/GROUP BY. Se le tue query cercheranno o abbineranno spesso una colonna in una di queste situazioni, dovresti prendere in considerazione la creazione di un indice.
Gli indici migliorano le prestazioni del database?
La maggior parte delle volte, la risposta breve è sì. Per le letture e le ricerche tra i dati, gli indici aumentano notevolmente le prestazioni. Non eseguire scansioni complete della tabella migliorerà quasi tutte le query SELECT. Questo ha un piccolo prezzo. Per le colonne che vengono spesso manipolate, è previsto un costo per ogni modifica. Questo può impantanare INSERT e AGGIORNAMENTI nel database.
Tipi di indice MySQL comuni
Esistono tre tipi comuni di indici MySQL:
- Chiave primaria
- Indice
- Unico
CHIAVE PRIMARIA
Una chiave primaria indica al server del database quale è la colonna o le colonne più importanti nella tabella. In genere, viene utilizzato per le colonne auto_increment id. Ad esempio, se hai una tabella che contiene informazioni sui dipendenti, vorresti una chiave primaria nella colonna "EMPLOYEE_ID". In altre tabelle, ad es. una tabella degli stipendi, faresti semplicemente riferimento a EMPLOYEE_ID anziché a tutti i dati del dipendente.
INDICE
Un INDEX standard viene utilizzato per dire al server del database che una o più colonne della tabella verranno cercate molto e quindi dovrebbe essere creato un indice su di esse. Questo può essere compilato durante la creazione della tabella o se trovi che ti serve un indice su una colonna in un secondo momento, può essere aggiunto in seguito.
UNICO
Un indice UNIQUE è un po' distinto in quanto pone vincoli specifici su ciò che può essere scritto nella tabella. Se si tenta di inserire una riga che contiene un valore già incluso nei dati, INSERT genererà un errore. Ciò consente ricerche rapide e una certa integrità dei dati.
Come creare un indice
Esistono diversi modi per creare un indice su una colonna. Puoi impostare un indice quando crei una tabella o successivamente con le istruzioni ALTER TABLE o CREATE INDEX.
Creazione di un indice PRIMARY KEY
Il modo più semplice per creare un indice PRIMARY KEY è farlo quando crei la tabella. Useremo un esempio di una tabella dipendente per questo tutorial. La tabella avrà tre colonne:ID, FIRSTNAME e LASTNAME. La creazione potrebbe essere simile a questa:
CREATE TABLE EMPLOYEE
(
ID INT,
FIRSTNAME CHAR(32),
LASTNAME CHAR(32)
);
Questa istruzione creerà la tabella senza un indice. Possiamo aggiungere la chiave primaria con un'istruzione come questa:
ALTER TABLE EMPLOYEE
ADD CONSTRAINT PRIMARY KEY (ID);
Questo dice a MySQL che abbiamo una chiave primaria sull'ID della colonna.
Un modo più semplice per farlo è durante la creazione della tabella. Ricominciando da capo, ricreeremo la tabella e aggiungeremo la chiave primaria in un'unica istruzione.
CREATE TABLE EMPLOYEE
(
ID INT,
FIRSTNAME CHAR(32),
LASTNAME CHAR(32),
PRIMARY KEY (ID)
);
Questa singola affermazione svolge gli stessi compiti delle prime due affermazioni sopra. Una chiave primaria può contenere più di una colonna, ma le colonne devono essere tutte univoche. La chiave primaria può essere utilizzata per identificare ogni singola riga nella tabella.
Creazione di un indice utilizzando CREATE INDEX
Utilizzando la tabella di esempio sopra, immagina che l'azienda abbia migliaia di dipendenti e desideri essere in grado di cercare rapidamente i dipendenti in base al cognome. Con una chiave primaria, può esserci solo una voce. Non puoi avere più persone con lo stesso ID dipendente. Con i cognomi, è abbastanza comune che più persone condividano quel nome. Ancora una volta, ci sono alcuni modi per farlo. Utilizzando la tabella sopra:
CREATE TABLE EMPLOYEE
(
ID INT,
FIRSTNAME CHAR(32),
LASTNAME CHAR(32),
PRIMARY KEY (ID)
);
Possiamo aggiungere un indice alla colonna COGNOME come questo:
CREATE INDEX idx1 ON EMPLOYEE (LASTNAME);
Le ricerche per COGNOME ora saranno più veloci su questa tabella. In questo esempio, "idx1" è il nome dell'indice. Ciò renderà più facile fare riferimento all'indice stesso in futuro, se necessario.
Un altro modo per aggiungere un indice a una tabella è con il comando ALTER TABLE. Per ottenere la stessa cosa che abbiamo fatto con l'istruzione precedente, eseguiremmo il seguente comando:
ALTER TABLE EMPLOYEE ADD INDEX idx1 (LASTNAME);
L'ultimo modo per aggiungere un indice che farebbe risparmiare tempo è farlo durante CREATE TABLE. Se sai in anticipo che cercherai o ti unirai a una colonna specifica, puoi creare la tabella iniziale con l'indice già presente:
CREATE TABLE EMPLOYEE
(
ID INT,
FIRSTNAME CHAR(32),
LASTNAME CHAR(32),
PRIMARY KEY (ID),
INDEX idx1 (LASTNAME)
);
Tutte e tre queste affermazioni creano lo stesso risultato.
Indici a più colonne
Un indice non deve essere solo su una singola colonna. Se vogliamo ricerche più veloci sia su FIRSTNAME che LASTNAME, possiamo creare un indice su entrambe le colonne. Nella tabella create sarebbe simile a questo:
CREATE TABLE EMPLOYEE
(
ID INT,
FIRSTNAME CHAR(32),
LASTNAME CHAR(32),
PRIMARY KEY (ID),
INDEX idx2 (LASTNAME,FIRSTNAME)
);
Utilizzando il comando CREA INDICE:
CREATE INDEX idx2 ON EMPLOYEE (LASTNAME, FIRSTNAME);
E infine, il comando ALTER TABLE:
ALTER TABLE EMPLOYEE ADD INDEX idx2 (LASTNAME, FIRSTNAME);
Creare UN INDICE UNICO
A volte potresti voler creare un indice su una colonna e anche forzare tutte le voci in quella colonna in modo che siano univoche. Se abbiamo esteso la nostra tabella di esempio per includere una colonna UFFICIO (che indica quale ufficio nell'edificio hanno), allora potremmo voler rendere questo un indice UNICO. Lavoriamo con questa tabella:
CREATE TABLE EMPLOYEE
(
ID INT,
FIRSTNAME CHAR(32),
LASTNAME CHAR(32),
OFFICE INT,
PRIMARY KEY (ID)
);
Si noti che ora abbiamo un numero intero memorizzato nella tabella per denotare quale ufficio occupa la persona. Questo può fare riferimento a un'altra tabella, "UFFICI", che conterrà informazioni sui vari uffici nell'edificio.
Per creare un indice su questo, emetteremo il seguente comando:
CREATE UNIQUE INDEX idx3 ON EMPLOYEE (OFFICE);
È possibile utilizzare comandi simili per crearli nei comandi CREATE TABLE e ALTER TABLE. Ora, se hai provato a eseguire questi due inserti:
INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, OFFICE) VALUES (1, 'JANE', 'JOHNSON', 1);
INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, OFFICE) VALUES (2, 'JOHN', 'SMITH', 1);
Riceveresti un errore sul secondo INSERT:
Duplicate entry '1' for key 'idx3'
Rimozione di un indice
Potrebbe venire un momento in cui non desideri più un indice su una colonna. Forse ti sei reso conto che non cerchi una colonna così spesso e l'indice sta rallentando gli inserimenti e gli aggiornamenti. Per fare ciò, utilizzeremo il comando DROP INDEX. Il nostro tavolo è stato creato così:
CREATE TABLE EMPLOYEE
(
ID INT,
FIRSTNAME CHAR,
LASTNAME CHAR,
PRIMARY KEY (ID),
INDEX idx (LASTNAME,FIRSTNAME)
);
Se vogliamo rimuovere l'indice dalle colonne LASTNAME e FIRSTNAME, emetteremo questo comando:
DROP INDEX IDX ON EMPLOYEE;
Conclusione
Gli indici di database sono uno strumento fondamentale che ottimizza la velocità di recupero dei dati all'interno di una struttura che sfrutta le prestazioni di ricerca e lettura in una tabella. Il miglioramento dell'indice è principalmente guidato al costo di più scritture e/o spazio di archiviazione al fine di mantenere una struttura dei dati dell'indice ottimale.
I database MySQL e MariaDB offrono molte altre ricerche e opzioni di lettura, incluse molte che non sono state trattate qui. I punti chiave qui includono:
- Assicurati di dedicare del tempo a pianificare i tuoi tavoli in anticipo.
- Se non pianifichi in anticipo la creazione delle tabelle, valuta le colonne che vengono cercate di più e crea un indice per esse.
Guardalo in azione!
La nostra ampia linea di server dedicati fornisce la potenza, la stabilità e la sicurezza necessarie per ospitare il database più piccolo per le aziende in crescita fino a una configurazione di server cluster ad alta disponibilità per le più grandi aziende. Vuoi vedere quali soluzioni possiamo offrire per soddisfare le tue esigenze?
Chiamaci al numero 800.580.4985 o apri una chat o un ticket con noi per parlare con uno dei nostri esperti consulenti di soluzioni o hosting per scoprire come sfruttare questa tecnologia oggi!