In questo tutorial, tratteremo alcuni dei fondamenti dell'indicizzazione. Come parte della serie MySQL, introdurremo le funzionalità dell'indicizzazione MySQL e il ruolo che svolge nell'ottimizzazione delle prestazioni del database. Liquid Web consiglia di consultare un DBA prima di apportare modifiche all'applicazione a livello di produzione.
Cos'è l'indicizzazione?
L'indicizzazione è una potente struttura in MySQL che può essere sfruttata per ottenere i tempi di risposta più rapidi dalle query comuni. Le query MySQL ottengono efficienza generando una tabella più piccola, chiamata indice, da una colonna o un insieme di colonne specificati. Queste colonne, denominate chiave, possono essere utilizzate per imporre l'unicità. Di seguito è riportata una semplice visualizzazione di un indice di esempio utilizzando due colonne come chiave.
+------+----------+----------+
| ROW | COLUMN_1 | COLUMN_2 |
+------+----------+----------+
| 1 | data1 | data2 |
+------+----------+----------+
| 2 | data1 | data1 |
+------+----------+----------+
| 3 | data1 | data1 |
+------+----------+----------+
| 4 | data1 | data1 |
+------+----------+----------+
| 5 | data1 | data1 |
+------+----------+----------+
Le query utilizzano gli indici per identificare e recuperare i dati di destinazione, anche se sono una combinazione di chiavi. Senza un indice, l'esecuzione della stessa query comporta un'ispezione di ogni riga per i dati necessari. L'indicizzazione produce una scorciatoia, con tempi di query molto più rapidi su tabelle estese. Un'analogia con i libri di testo può fornire un altro modo comune per visualizzare come funzionano gli indici.
Quando abilitare l'indicizzazione?
L'indicizzazione è vantaggiosa solo per tabelle enormi con informazioni a cui si accede regolarmente. Ad esempio, per continuare con la nostra analogia con i libri di testo, non ha molto senso indicizzare un libro di fiabe per bambini con solo una dozzina di pagine. È più efficiente leggere semplicemente il libro per trovare ogni occorrenza della parola "tartaruga" piuttosto che impostare e mantenere indici, eseguire query per quegli indici e quindi rivedere ogni pagina fornita. Nel mondo informatico, le attività extra che circondano l'indicizzazione rappresentano risorse sprecate che sarebbero meglio mirate se non indicizzassero.
Senza indici, quando le tabelle crescono in proporzioni enormi, i tempi di risposta risentono delle query rivolte a quelle tabelle ottuse. Le query inefficienti si manifestano in latenza all'interno delle prestazioni dell'applicazione o del sito Web. Di solito identifichiamo questa latenza utilizzando la funzione di registro delle query lente di MySQL. Puoi trovare maggiori dettagli sull'utilizzo della funzionalità di registro delle query lente nel primo articolo di questa serie:Prestazioni MySQL:identificazione di query lunghe.
Una volta che una tabella colossale raggiunge il punto critico, raggiunge il potenziale tempo di inattività per applicazioni e siti Web . L'esecuzione di valutazioni di routine per il database in crescita stabilisce prestazioni ottimali del database ed evita le interruzioni intrinseche delle query lunghe.
Pro e contro dell'indicizzazione di MySQL
Ci sono vantaggi e svantaggi nell'utilizzo dell'indicizzazione MySQL e discuteremo i vantaggi e gli svantaggi significativi da prendere in considerazione. Questi aspetti ti guideranno a decidere se l'indicizzazione è una scelta appropriata per la tua situazione.
Quali informazioni vengono indicizzate?
Selezionare cosa indicizzare è probabilmente la parte più difficile dell'indicizzazione dei database. Determinare cosa è abbastanza importante da indicizzare e cosa è abbastanza benigno da non indicizzare. In generale, l'indicizzazione funziona meglio su quelle colonne che sono oggetto delle clausole WHERE nelle query eseguite di frequente. Considera la seguente tabella semplificata:
ID, TITLE, LAST_NAME, FIRST_NAME, MAIDEN_NAME, DOB, GENDER, AGE, DESCRIPTION, HISTORY, ETC...
Se le tue query si basano sul test della clausola WHERE utilizzando LAST_NAME e FIRST_NAME, l'indicizzazione da parte di queste due colonne aumenterebbe notevolmente i tempi di risposta della query. In alternativa, se le tue query si basano su una semplice ricerca di ID, l'indicizzazione per ID sarebbe la scelta migliore.
Questi esempi sono solo un esempio rudimentale e ci sono diversi tipi di strutture di indicizzazione integrate in MySQL. La seguente pagina MySQL discute questi tipi di indici in modo più dettagliato e una lettura consigliata per chiunque stia considerando l'indicizzazione:Come MySQL utilizza gli indici
Che cos'è un indice univoco?
Un altro punto da considerare quando si valuta quali colonne fungere da chiave nell'indice è se utilizzare il vincolo UNIQUE. L'impostazione del vincolo UNIQUE imporrà l'univocità in base alla chiave di indicizzazione configurata. Come con qualsiasi chiave, questa può essere una singola colonna o una concatenazione di più colonne. La funzione di questo vincolo garantisce che non vi siano voci duplicate nella tabella in base alla chiave configurata.
Che cos'è un indice di chiave primaria?
Chiamato comunemente come il vincolo UNIQUE, la CHIAVE PRIMARIA viene utilizzata per ottimizzare gli indici. Questo vincolo garantisce che la CHIAVE PRIMARIA designata non possa avere un valore nullo. Di conseguenza, si verifica un aumento delle prestazioni durante l'esecuzione su un motore di archiviazione InnoDB per la tabella in questione. Questo aumento è dovuto al modo in cui InnoDB archivia fisicamente i dati, posizionando le righe con valore nullo nella chiave fuori dalla sequenza contigua con le righe che hanno valori. L'abilitazione di questo vincolo garantisce che le righe della tabella vengano mantenute in ordine contiguo per risposte più rapide.
Gestione degli indici
Ora tratteremo alcune delle nozioni di base sulla manipolazione degli indici usando la sintassi MySQL. Negli esempi, includeremo la creazione, l'eliminazione e l'elenco degli indici. Tieni presente che questi esempi hanno voci segnaposto per le parole chiave specifiche. Queste parole chiave sono di natura autoesplicativa per una facile lettura e di seguito è riportato uno schema di esse.
Elencare/Mostrare gli indici
Le tabelle possono avere più indici. La gestione degli indici richiederà inevitabilmente la possibilità di elencare gli indici esistenti su una tabella. La sintassi per visualizzare un indice è la seguente.
SHOW INDEX FROM tableName;
Creazione di indici
La creazione dell'indice ha una sintassi semplice. La difficoltà sta nel determinare quali colonne necessitano di indicizzazione e se è necessaria l'applicazione dell'unicità. Di seguito illustreremo come creare indici con e senza una CHIAVE PRIMARIA e vincoli UNIQUE.
Come accennato in precedenza, le tabelle possono avere più indici. L'indicizzazione multipla è utile per creare indici in sintonia con le query richieste dall'applicazione o dal sito Web. Le impostazioni predefinite consentono fino a 16 indici per tabella, aumentare questo numero ma generalmente è più del necessario. Gli indici possono essere creati durante la creazione di una tabella o aggiunti alla tabella come indici aggiuntivi in seguito. Esamineremo entrambi i metodi di seguito.
Esempio:crea una tabella con un indice standard
CREATE TABLE tableName (
ID int,
LName varchar(255),
FName varchar(255),
DOB varchar(255),
LOC varchar(255),
INDEX ( ID )
);
Esempio:crea una tabella con indice univoco e chiave primaria
CREATE TABLE tableName (
ID int,
LName varchar(255),
FName varchar(255),
DOB varchar(255),
LOC varchar(255),
PRIMARY KEY (ID),
UNIQUE INDEX ( ID )
);
Esempio:aggiungi un indice a una tabella esistente
CREATE INDEX indexName ON tableName (ID, LName, FName, LOC);
Esempio:aggiungi un indice a una tabella esistente con chiave primaria
CREATE UNIQUE INDEX indexName ON tableName (ID, LName, FName, LOC);
Eliminazione di indici
Durante la gestione degli indici, potrebbe essere necessario rimuoverne alcuni. Anche l'eliminazione degli indici è un processo molto semplice, vedi l'esempio seguente:
DROP INDEX indexName ON tableName;
Esistono molti modi per ottimizzare il database per una vera efficienza. Se desideri saperne di più o convertire i tipi di motori di ricerca disponibili in MySQL, leggi il nostro tutorial MyISAM vs. InnoDB. Oppure, se hai bisogno di database ad alto funzionamento, dai un'occhiata alla nostra pagina del prodotto MySQL per visualizzare diverse opzioni.