Mysql
 sql >> Database >  >> RDS >> Mysql

Best practice per la creazione di indici sulle tabelle MySQL:build di indici a rotazione

Disponendo di indici appropriati sulle tabelle MySQL, puoi migliorare notevolmente le prestazioni delle query SELECT. Ma sapevi che l'aggiunta di indici alle tue tabelle di per sé è un'operazione costosa e potrebbe richiedere molto tempo per essere completata a seconda delle dimensioni delle tue tabelle? Durante questo periodo, è anche probabile che si verifichi un peggioramento delle prestazioni delle query poiché anche le risorse di sistema sono impegnate nel lavoro di creazione dell'indice. In questo post del blog, discutiamo un approccio per ottimizzare il processo di creazione dell'indice MySQL in modo tale che il tuo normale carico di lavoro non venga influenzato.

Creazione di MySQL Rolling Index

Chiamiamo questo approccio una "creazione di un indice di rotazione" - se hai un set di repliche master-slave MySQL, puoi creare l'indice un nodo alla volta in modo continuo. È necessario creare l'indice solo sui nodi slave in modo che le prestazioni del master non siano influenzate. Una volta completata la creazione dell'indice sugli slave, declassiamo il master corrente e promuoviamo uno degli slave aggiornato come nuovo master. A questo punto, la creazione dell'indice continua sul nodo master originale (che ora è uno slave). Ci sarà una breve durata (decine di secondi) durante la quale perderai la connettività al tuo database a causa del failover, ma può essere superato effettuando nuovi tentativi a livello di applicazione.

Vantaggi in termini di prestazioni della creazione di un indice mobile

Abbiamo fatto un piccolo esperimento per comprendere i vantaggi in termini di prestazioni della creazione di indici mobili.

Il test ha utilizzato un set di dati MySQL creato utilizzando Sysbench che aveva 3 tabelle con 50 milioni di righe ciascuna. Abbiamo generato un carico sul master MySQL con 30 client che eseguono un carico di lavoro bilanciato (50% di letture e 50% di scritture) per 10 minuti e, allo stesso tempo, abbiamo costruito un semplice indice secondario su una delle tabelle in due scenari:

  1. Creazione dell'indice direttamente sul master
  2. Creazione dell'indice sullo slave

Configurazione del banco di prova MySQL

Tipo di istanza MySQL Istanza EC2 m4.large con 8 GB di RAM
Tipo di distribuzione Set master-slave a 2 nodi con replica semisincrona
Versione MySQL 5.7.25

Risultati delle prestazioni

Scenario Produttività del carico di lavoro (query al secondo) 95° percentile di latenza
Creazione dell'indice su Master 453.63 670 ms
Creazione dell'indice di rotazione 790.03 390 ms

Asporto

Eseguendo la creazione dell'indice direttamente sul master MySQL, abbiamo potuto sperimentare solo il 60% del throughput ottenuto eseguendo la creazione dell'indice sullo slave MySQL tramite un'operazione in sequenza. Anche la latenza del 95° percentile delle query era 1,8 volte superiore quando la creazione dell'indice è avvenuta sul server master.

Best practice per la creazione di indici nelle tabelle #MySQLFai clic per twittare

Automatizzazione della creazione del Rolling Index

ScaleGrid automatizza la creazione di Rolling Index per la tua distribuzione MySQL con una semplice interfaccia utente per avviarla.

Nell'interfaccia utente sopra, puoi selezionare il nome del database e della tabella e "Aggiungi indice" come operazione di modifica della tabella. Quindi, specifica un Nome colonna e un Nome indice e un comando Alter Table verrà generato e visualizzato per te. Dopo aver fatto clic su Crea, la creazione dell'indice avverrà un nodo alla volta in modo continuo.

Inoltre, ScaleGrid supporta anche altre semplici operazioni di Alter Table come l'aggiunta di una nuova colonna alla tabella in modo progressivo. Resta sintonizzato per il mio post successivo sul blog con maggiori dettagli!