Questo articolo discute gli indici e come puoi usarli per migliorare le prestazioni delle query del database MySQL.
Prestazioni e indici del database
Gli indici di database in MySQL ti consentono di accelerare le prestazioni di SELECT dichiarazioni di interrogazione. Per le tabelle piccole, un indice non aiuta molto. Tuttavia, se hai tabelle con una grande quantità di dati, gli indici possono migliorare notevolmente le prestazioni.
I seguenti comportamenti indicano che le tabelle possono trarre vantaggio dall'aggiunta di indici:
- Il tuo sito si carica molto lentamente o non si carica affatto.
- Un'applicazione non è in grado di connettersi al proprio database.
- Viene eseguito il backup delle query del database.
Se si verifica uno di questi problemi, è necessario analizzare le query del database e considerare l'aggiunta di indici.
Se si dispone di un VPS gestito o di un server dedicato gestito, oltre all'aggiunta di indici può essere utile anche una maggiore dimensione del buffer di ordinamento. Si prega di aprire un ticket sul Portale Clienti all'indirizzo https://my.a2hosting.com per discutere questa opzione con il nostro Guru Crew.Analisi delle query del database
Per determinare quali tabelle possono trarre vantaggio dall'utilizzo degli indici, è necessario analizzare le query del database. Il ESPLORA SELEZIONA dichiarazione ti aiuta a farlo. Per analizzare le query del database, procedi nel seguente modo:
- Accedi al tuo account utilizzando SSH.
- Al prompt dei comandi, digita il comando seguente, sostituendo nome utente con il nome utente del tuo account A2 Hosting e il database con il nome del database:
mysql -u username -p database
- Al prompt Immettere la password, digitare la password. Viene visualizzato il prompt di mysql>.
-
Digitare il seguente comando SQL:
EXPLAIN SELECT * FROM table_name WHERE conditions \G
Se scrivi il tuo codice dell'applicazione, conosci già il SELECT istruzioni utilizzate per recuperare i dati. Se stai utilizzando un'applicazione di terze parti, come WordPress o PrestaShop, potrebbe essere necessario esaminare il codice sorgente o i registri del database per determinare l'esatto SELECT istruzioni utilizzate per recuperare i dati. -
Output da EXPLAIN SELECT mostra come Query Optimizer MySQL eseguirà la query. Si consideri ad esempio il seguente output:
mysql> EXPLAIN SELECT title FROM employees WHERE lastname LIKE 'T%' \G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: employees type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 142 Extra: Using where 1 row in set (0.00 sec)
In questo esempio di output:
- Le chiavi_possibili e chiave i valori sono entrambi NULL , che indica che MySQL non ha un indice da utilizzare per questa query.
- Le righe value indica che MySQL leggerà 142 righe per questa query. Se nella tabella sono presenti 142 righe in totale, significa che MySQL deve esaminare ogni riga per generare il set di risultati. Potrebbe volerci un po' di tempo per un tavolo grande.
D'altra parte, se dovessimo creare un indice chiamato nome_indice per il cognome colonna, MySQL potrebbe generare il seguente output per la stessa query:
mysql> EXPLAIN SELECT title FROM employees WHERE lastname LIKE 'T%' \G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: employees type: range possible_keys: index_name key: index_name key_len: 22 ref: NULL rows: 17 Extra: Using where; Using index 1 row in set (0.00 sec)
Come puoi vedere, i possible_keys e chiave i valori indicano che MySQL ha trovato un indice che può utilizzare per ottimizzare la query. Inoltre, MySQL leggerà solo 17 righe per generare il set di risultati, invece di tutte le 142 righe. (Ciò significa che la tabella ha 17 righe in cui il cognome inizia con "T".) Infine, il Extra value indica anche che MySQL utilizzerà un indice per la query.
Aggiunta, rimozione e visualizzazione di indici in una tabella
Dopo aver analizzato le query del database e aver determinato dove si trovano i colli di bottiglia delle prestazioni, sei pronto per aggiungere gli indici. Per fare ciò, segui questi passaggi:
- Accedi al tuo account utilizzando SSH.
- Al prompt dei comandi, digita il comando seguente, sostituendo nome utente con il nome utente del tuo account A2 Hosting e il database con il nome del database:
mysql -u username -p database
- Al prompt Immettere la password, digitare la password. Viene visualizzato il prompt di mysql>.
-
Per aggiungere un indice a una tabella, digitare il seguente comando SQL. Sostituisci nome_tabella con il nome della tabella, nome_indice con il nome del nuovo indice (che può essere qualsiasi cosa tu voglia) e table_column con il nome della colonna della tabella di cui si vuole aggiungere l'indice:
ALTER TABLE table_name ADD INDEX index_name (table_column);
Sebbene gli indici possano migliorare le prestazioni, gli indici possono anche avere un impatto negativo sulle prestazioni se ce ne sono troppi. Questo perché più indici ha una tabella, più lavoro deve fare MySQL per mantenerli aggiornati. Il trucco è trovare il giusto equilibrio tra un numero sufficiente di indici per migliorare le prestazioni, ma non così tanti da incidere negativamente sulle prestazioni. -
Per rimuovere un indice da una tabella, digitare il seguente comando SQL. Sostituisci nome_tabella con il nome della tabella e sostituisci nome_indice con il nome dell'indice che si desidera eliminare:
ALTER TABLE table_name DROP INDEX index_name;
-
Per visualizzare tutti gli indici di una tabella, digitare il comando SQL seguente. Sostituisci nome_tabella con il nome della tabella:
SHOW INDEX FROM table_name \G
Dopo aver creato un indice, dovresti utilizzare EXPLAIN SELECT istruzione di nuovo per vedere come vengono influenzate le query. Inoltre, dovresti continuare a monitorare le prestazioni del database per vedere se sono presenti miglioramenti. Potrebbe essere necessario eseguire una serie di test per trovare il numero ottimale di indici per il tuo database.
Maggiori informazioni
- Per ulteriori informazioni sull'ottimizzazione e gli indici di MySQL, visitare https://dev.mysql.com/doc/refman/5.5/en/optimization-indexes.html.
- Per ulteriori informazioni su EXPLAIN dichiarazione, visitare https://dev.mysql.com/doc/refman/5.5/en/explain.html.