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

Comprendere gli indici in MySQL:parte seconda

Questo post del blog è la seconda parte della serie di blog sugli indici in MySQL. Nella prima parte della serie di post sul blog sugli indici MySQL, abbiamo trattato molte cose, tra cui cosa sono, cosa fanno, quali sono i loro tipi, come scegliere i tipi di dati ottimali e i set di caratteri MySQL per gli indici che usi . Abbiamo esaminato i vantaggi e gli svantaggi dell'utilizzo degli indici in MySQL; ti abbiamo spiegato come scegliere l'indice migliore da utilizzare, come migliorare le prestazioni delle query e assicurarti che MySQL utilizzi i tuoi indici, quanti indici dovresti avere. Abbiamo anche esaminato alcune considerazioni relative ai motori di archiviazione. Questo post del blog andrà più in dettaglio su alcuni dei contenuti che abbiamo discusso nella prima parte della serie. Inizieremo con la correlazione tra indici e motori di archiviazione in MySQL.

Indici e motori di archiviazione in MySQL

Come abbiamo già accennato in un precedente post del blog, potrebbero esserci alcuni tipi di limitazioni agli indici e altre cose se utilizzi determinati motori di archiviazione in MySQL. Eccone alcuni:ora definiremo quali sono alcuni di essi (alcuni di essi sono stati trattati nella prima parte della serie di blog, quindi se ci manca qualcosa probabilmente è lì), quindi coprirli con una descrizione più approfondita analisi:

  • Come da documentazione MySQL, il numero massimo di indici, la lunghezza massima della chiave e la lunghezza massima dell'indice sono definito per motore di archiviazione. Come abbiamo già accennato in un precedente post del blog, il numero massimo di indici per tabelle MyISAM e InnoDB è 64, il numero massimo di colonne per indice in entrambi i motori di archiviazione è 16, la lunghezza massima della chiave per InnoDB è 3500 byte e la massima la lunghezza della chiave per MyISAM è 1000 byte.

  • Non puoi usare CREATE INDEX per creare una CHIAVE PRIMARIA, usa invece ALTER TABLE.

  • Le colonne BLOB e TEXT possono essere indicizzate solo per le tabelle che eseguono i motori di archiviazione InnoDB, MyISAM e BLACKHOLE.

  • Se indicizzi solo un prefisso della colonna, tieni presente che anche il supporto del prefisso e la loro lunghezza sono dipendente dai motori di stoccaggio. Un prefisso può essere lungo fino a 767 byte per le tabelle InnoDB che utilizzano il formato di riga RIDONDANTE o COMPATTO, ma per i formati di riga DYNAMIC o COMPRESSED il limite di lunghezza del prefisso viene aumentato a 3072 byte. Per le tabelle MyISAM, il limite di lunghezza del prefisso è 1000 byte. Il motore di archiviazione NDB non supporta affatto i prefissi.

  • Se è abilitata una modalità SQL rigorosa e il prefisso dell'indice supera la dimensione massima del tipo di dati della colonna, CREATE INDEX genera un errore. Se una modalità SQL rigorosa non è abilitata, CREATE INDEX genera un avviso. Se viene creato un INDICE UNICO, si verifica un errore.

  • In generale, MySQL consente solo di creare fino a 16 indici su una determinata tabella.

  • Se stai usando un indice PRIMARY KEY, puoi avere solo una chiave primaria per tabella. FULLTEXT, UNIQUE INDEX e INDEX non hanno questa limitazione.

  •  Se utilizzi indici FULLTEXT, tieni presente che possono essere utilizzati solo per i motori di archiviazione InnoDB o MyISAM e per le colonne CHAR, VARCHAR o TEXT. Tieni inoltre presente che MySQL utilizza gli indici FULLTEXT solo quando vengono utilizzate le clausole MATCH() AGAINST() e che puoi effettivamente avere un indice e un indice fulltext sulla stessa colonna allo stesso tempo se lo desideri e che gli indici FULLTEXT hanno i loro proprio set di stopword, ciascuno specifico per i motori di archiviazione in uso.

  • Gli indici B-Tree possono essere utili se si utilizzano query LIKE che iniziano con un carattere jolly, ma solo in alcuni scenari.

Conoscere queste limitazioni di indice dovrebbe rivelarsi utile se stai cercando di capire come funzionano gli indici in MySQL. Ciò che è ancora più importante da capire è il fatto che devi verificare che i tuoi indici siano effettivamente utilizzati da MySQL. Ne abbiamo accennato brevemente nella prima parte di queste serie ("Come scegliere il miglior indice da utilizzare?"), ma non vi abbiamo detto come verificare che i vostri indici siano effettivamente utilizzati da MySQL. Per fare ciò, verifica il loro utilizzo utilizzando EXPLAIN:quando EXPLAIN viene utilizzato insieme a un'istruzione spiegabile, MySQL visualizza le informazioni dall'ottimizzatore sul piano di esecuzione dell'istruzione.

Considerazioni SULLA CHIAVE PRIMARIA

Alcune delle considerazioni di base relative agli indici PRIMARY KEY in MySQL includono il fatto che vengono utilizzati principalmente per identificare in modo univoco i record in una tabella e sono frequentemente utilizzati con valori AUTO_INCREMENT, il che significa che possono essere molto utili se stai creando, diciamo, campi ID. I campi PRIMARY KEY devono contenere valori univoci e non possono contenere valori NULL.

Corrispondenza a un prefisso di colonna

Gli indici possono anche corrispondere a un prefisso di colonna. Questo approccio agli indici può essere utile se le tue colonne sono colonne di stringa e ritieni che l'aggiunta di un indice sull'intera colonna possa potenzialmente consumare molto spazio su disco. I tuoi indici possono corrispondere a un prefisso di colonna in questo modo:

ALTER TABLE demo_table ADD INDEX index_name(column_name(length));

La query precedente aggiungerebbe un indice index_name su una colonna denominata column_name solo per un prefisso di colonna definito. Per scegliere una buona quantità di lunghezza da indicizzare, assicurati che l'uso del prefisso massimizzi l'unicità dei valori nella colonna:trova il numero di righe nella tabella e valuta diverse lunghezze del prefisso fino a raggiungere l'unicità delle righe desiderata.

Indici FULLTEXT in MySQL

Gli indici FULLTEXT in MySQL sono una bestia completamente diversa. Hanno molte limitazioni uniche per se stessi (ad esempio, InnoDB ha un elenco di stopword composto da 36 parole mentre l'elenco di stopword MyISAM è composto da 143 parole), hanno anche modalità di ricerca uniche. Alcuni di essi includono una modalità in linguaggio naturale (per attivare tale modalità di ricerca, eseguire una query di ricerca FULLTEXT senza modificatori), è anche possibile espandere la ricerca (per farlo, utilizzare il modificatore WITH QUERY EXPANSION - tale modalità di ricerca esegue il cerca due volte, ma quando la ricerca viene eseguita per la seconda volta include alcuni record più rilevanti della prima ricerca (usati frequentemente quando un utente ha una conoscenza implicita di qualcosa), per cercare con operatori booleani utilizzare il modificatore IN BOOLEAN MODE. Gli indici FULLTEXT verranno utilizzati anche solo se la query di ricerca è composta da un minimo di tre caratteri per InnoDB e un minimo di quattro caratteri per MyISAM.

Utilizzo degli indici B-Tree con caratteri jolly

Gli indici sono usati frequentemente anche se stai costruendo qualcosa di simile ai motori di ricerca. Per questo, spesso si desidera cercare solo una parte di un valore e restituire i risultati:ecco dove intervengono i caratteri jolly. Una query semplice che utilizza un carattere jolly utilizza una query LIKE e il segno % per indicare "qualsiasi cosa" dopo il testo. Ad esempio, una query come questa cercherà risultati che iniziano con la parola "cerca" e che contengono qualcosa dopo di essa:

SELECT * FROM … WHERE demo_column LIKE ‘search%’;

Una query del genere cercherebbe risultati che iniziano con qualsiasi cosa, con la parola "cerca" e con qualsiasi cosa dopo di essa:

SELECT * FROM … WHERE demo_column LIKE ‘%search%’;

Ma ecco un problema:la query precedente non utilizzerà un indice. Come mai? Perché ha un carattere jolly all'inizio di se stesso e MySQL non è in grado di capire con cosa deve iniziare la colonna. Ecco perché abbiamo detto che gli indici con caratteri jolly hanno il loro posto, ma solo in scenari specifici, ovvero scenari in cui non hai un carattere jolly all'inizio della query di ricerca.

Utilizzo di ClusterControl per monitorare le prestazioni delle query

Oltre a utilizzare EXPLAIN, puoi anche utilizzare ClusterControl per monitorare le prestazioni delle tue query:ClusterControl fornisce una serie di funzionalità avanzate di monitoraggio e reporting che ti consentono di tenere traccia delle prestazioni delle tue istanze e query del database . Ad esempio, fai clic su un cluster e vedrai una scheda "Query Monitor". Cliccaci sopra e ClusterControl ti consentirà di osservare lo stato delle tue query nelle istanze del tuo database:

Questa parte di ClusterControl ti consente di visualizzare un elenco di top slow e long- eseguendo query consentendoti anche di filtrarle. Ad esempio, se sai che non molto tempo fa hai eseguito una query che consisteva in @@log_bin, puoi semplicemente cercare il termine e ClusterControl restituirà un elenco di risultati:

Come probabilmente avrai notato, puoi anche filtrare le query in base agli host che utilizzi o in base alle occorrenze, puoi anche scegliere di visualizzare un insieme di righe, ad esempio 20, 100 o 200. ClusterControl ti dirà anche quando la query è stata vista l'ultima volta, qual è stato il tempo di esecuzione totale, quante righe ha restituito, quante righe ha esaminato e così via. ClusterControl può rivelarsi utile se vuoi osservare come i tuoi indici vengono effettivamente utilizzati da istanze MySQL, MariaDB, MongoDB, PostgreSQL o TimescaleDB.

Riepilogo

In questo post del blog abbiamo esaminato alcune limitazioni e vantaggi relativi agli indici in MySQL e abbiamo anche spiegato come ClusterControl può aiutarti a raggiungere i tuoi obiettivi di prestazioni del database. Avremo anche una terza parte sugli indici in MySQL che approfondiscono ulteriormente gli stessi, ma per concludere ciò che abbiamo trattato finora, tieni presente che gli indici in MySQL hanno sicuramente il loro posto:per sfruttarli al meglio, sapere come interagiscono con i motori di archiviazione, i loro vantaggi e limiti, come e quando utilizzare determinati tipi di indici e scegliere con saggezza.