MariaDB
 sql >> Database >  >> RDS >> MariaDB

Comprendere gli indici in MySQL:parte terza

Questo post del blog è la terza parte della serie di blog sugli indici in MySQL . Nella seconda parte della serie di post del blog sugli indici MySQL , abbiamo trattato indici e motori di archiviazione e abbiamo toccato alcune considerazioni sulla CHIAVE PRIMARIA. La discussione includeva come abbinare un prefisso di colonna, alcune considerazioni sull'indice FULLTEXT e come utilizzare gli indici B-Tree con caratteri jolly e come utilizzare ClusterControl per monitorare le prestazioni delle query, quindi gli indici.

 

In questo post del blog, approfondiremo alcuni dettagli sugli indici in MySQL :tratteremo gli indici hash, la cardinalità dell'indice, la selettività dell'indice, ti diremo dettagli interessanti sulla copertura degli indici e analizzeremo anche alcune strategie di indicizzazione. E, naturalmente, toccheremo ClusterControl. Cominciamo, vero?

Indici hash in MySQL

I DBA MySQL e gli sviluppatori che si occupano di MySQL hanno anche un altro asso nella manica per quanto riguarda MySQL:anche gli indici hash sono un'opzione. Gli indici hash sono usati frequentemente nel motore MEMORY di MySQL:come praticamente tutto in MySQL, questi tipi di indici hanno i loro vantaggi e svantaggi. Lo svantaggio principale di questo tipo di indici è che vengono utilizzati solo per confronti di uguaglianza che utilizzano gli operatori =o <=>, il che significa che non sono molto utili se si desidera cercare un intervallo di valori, ma il vantaggio principale è che le ricerche sono molto veloci. Un altro paio di aspetti negativi includono il fatto che gli sviluppatori non possono utilizzare nessun prefisso più a sinistra della chiave per trovare le righe (se vuoi farlo, usa invece gli indici B-Tree), il fatto che MySQL non può determinare approssimativamente quante righe ci sono tra due valori:se sono in uso indici hash, l'ottimizzatore non può utilizzare un indice hash per velocizzare le operazioni ORDER BY. Tieni presente che gli indici hash non sono l'unica cosa supportata dal motore MEMORY:anche i motori MEMORY possono avere indici B-Tree.

Cardinalità dell'indice in MySQL

Per quanto riguarda gli indici MySQL, potresti anche sentire un altro termine in giro:questo termine è chiamato cardinalità dell'indice. In termini molto semplici, la cardinalità dell'indice si riferisce all'unicità dei valori archiviati in una colonna che utilizza un indice. Per visualizzare la cardinalità dell'indice di un indice specifico, puoi semplicemente andare alla scheda Struttura di phpMyAdmin e osservare le informazioni lì oppure puoi anche eseguire una query MOSTRA INDICI:

mysql> SHOW INDEXES FROM demo_table;
+---------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table         | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| demo_table |          1 | demo     |            1 | demo        | A         |      494573 |     NULL | NULL   |      | BTREE      |         |               |
+---------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)

L'output della query SHOW INDEXES che puoi vedere sopra come puoi vedere ha molti campi, uno dei quali raffigura la cardinalità dell'indice:questo campo restituisce un numero stimato di valori univoci nell'indice - il maggiore è la cardinalità, maggiore è la possibilità che Query Optimizer utilizzi l'indice per le ricerche. Detto questo, anche la cardinalità dell'indice ha un fratello:il suo nome è selettività dell'indice.

Selettività dell'indice in MySQL

Una selettività di indice è il numero di valori distinti in relazione al numero di record nella tabella. In termini semplici, la selettività dell'indice definisce quanto strettamente un indice di database aiuta MySQL a restringere la ricerca di valori. Una selettività dell'indice ideale è il valore di 1. Una selettività dell'indice viene calcolata dividendo i valori distinti in una tabella per il numero totale di record, ad esempio, se nella tabella sono presenti 1.000.000 di record, ma solo 100.000 di essi sono valori distinti , la selettività dell'indice sarebbe 0.1. Se nella tabella sono presenti 10.000 record e 8.500 di essi sono valori distinti, la selettività dell'indice sarebbe 0,85. È molto meglio. Hai capito. Maggiore è la selettività dell'indice, meglio è.

Copertura degli indici in MySQL

Un indice di copertura è un tipo speciale di indice in InnoDB. Quando è in uso un indice di copertura, tutti i campi richiesti per una query sono inclusi, o "coperti", dall'indice, il che significa che puoi anche trarre vantaggio dalla lettura solo dell'indice anziché dei dati. Se nient'altro aiuta, un indice di copertura potrebbe essere il tuo biglietto per migliorare le prestazioni. Alcuni dei vantaggi dell'utilizzo degli indici di copertura includono:

  • Uno degli scenari principali in cui un indice di copertura potrebbe essere utile include il servizio di query senza letture di I/O aggiuntive sui grandi tavoli.

  • MySQL può anche accedere a meno dati poiché le voci dell'indice sono più piccole della dimensione delle righe.

  • La maggior parte dei motori di archiviazione memorizza nella cache gli indici meglio dei dati.

La creazione di indici di copertura su una tabella è piuttosto semplice:copri semplicemente i campi a cui si accede dalle clausole SELECT, WHERE e GROUP BY:

ALTER TABLE demo_table ADD INDEX index_name(column_1, column_2, column_3);

Tieni presente che quando si tratta di coprire gli indici, è molto importante scegliere l'ordine corretto delle colonne nell'indice. Affinché i tuoi indici di copertura siano efficaci, inserisci prima le colonne che usi con le clausole WHERE, poi ORDER BY e GROUP BY e per ultime le colonne utilizzate con la clausola SELECT.

Strategie di indicizzazione in MySQL

Seguire i consigli trattati in queste tre parti dei post del blog sugli indici in MySQL può fornirti una base davvero buona, ma ci sono anche un paio di strategie di indicizzazione che potresti voler usare se lo desideri sfrutta davvero la potenza degli indici nella tua architettura MySQL. Affinché i tuoi indici aderiscano alle best practice MySQL, considera:

  1. Isolando la colonna su cui usi l'indice - in generale, MySQL non usa gli indici se le colonne sono vengono utilizzati su non sono isolati. Ad esempio, una query di questo tipo non utilizzerà un indice perché non è isolato:

    SELECT demo_column FROM demo_table WHERE demo_id + 1 = 10;


    Tale query, tuttavia, sarebbe:
     

    SELECT demo_column FROM demo_table WHERE demo_id = 10;

  2. Non utilizzare indici sulle colonne che indicizzi. Ad esempio, l'utilizzo di una query del genere non sarebbe molto utile, quindi è meglio evitare tali query se puoi:
     

    SELECT demo_column FROM demo_table WHERE TO_DAYS(CURRENT_DATE) - TO_DAYS(column_date) <= 10;

  3. Se utilizzi query LIKE insieme a colonne indicizzate, evita di inserire il carattere jolly all'inizio della query di ricerca perché in questo modo anche MySQL non utilizzerà un indice. Questo è invece di scrivere query come questa:

    SELECT * FROM demo_table WHERE demo_column LIKE ‘%search query%’;


    Considera di scriverli in questo modo:

    SELECT * FROM demo_table WHERE demo_column LIKE ‘search_query%’;


    La seconda query è migliore perché MySQL sa da cosa inizia la colonna e può utilizzare gli indici in modo più efficace. Come per ogni cosa, però, l'istruzione EXPLAIN può essere di grande aiuto se vuoi assicurarti che i tuoi indici siano effettivamente utilizzati da MySQL.

Utilizzo di ClusterControl per mantenere efficienti le query

Se vuoi migliorare le prestazioni di MySQL, i consigli di cui sopra dovrebbero metterti sulla strada giusta. Se ritieni di aver bisogno di qualcosa in più, considera ClusterControl per MySQL. Una delle cose in cui ClusterControl può aiutarti include la gestione delle prestazioni - come già notato nei post precedenti del blog, ClusterControl può anche aiutarti a mantenere le tue query sempre al meglio delle loro capacità - perché ClusterControl include anche una query monitor che ti consente di monitorare le prestazioni delle tue query, vedere query lente e di lunga durata e anche valori anomali delle query che ti avvisano dei possibili colli di bottiglia nelle prestazioni del tuo database prima che tu possa accorgertene tu stesso:

Puoi persino filtrare le tue query permettendoti di fare un'ipotesi se un indice è stato utilizzato da una singola query o meno:

ClusterControl può essere un ottimo strumento per migliorare le prestazioni del database eliminando al contempo il problema della manutenzione. Per ulteriori informazioni su ciò che ClusterControl può fare per migliorare le prestazioni delle tue istanze MySQL, dai un'occhiata alla pagina ClusterControl per MySQL.

Riepilogo

Come probabilmente puoi dire ormai, gli indici in MySQL sono una bestia molto complessa. Per scegliere l'indice migliore per la tua istanza MySQL, sapere cosa sono gli indici e cosa fanno, conoscere i tipi di indici MySQL, conoscerne vantaggi e svantaggi, informarti su come gli indici MySQL interagiscono con i motori di archiviazione, dai un'occhiata anche a ClusterControl per MySQL se ritieni che automatizzare determinate attività relative agli indici in MySQL possa semplificarti la giornata.