Abbiamo discusso come configurare InnoDB per prestazioni elevate qualche tempo fa, tuttavia, non abbiamo ancora discusso di come possiamo migliorare le prestazioni di MySQL utilizzando le impostazioni avanzate di InnoDB. Questo post del blog dovrebbe fornire un po' più di informazioni su questo argomento.
Spiegazione di InnoDB
Prima di approfondire le impostazioni di InnoDB, dovremmo probabilmente comprendere le basi:InnoDB è un motore di archiviazione per MySQL, MariaDB e Percona Server. Il motore era noto come InnoDB Plugin, che richiede la configurazione e l'installazione del plug-in. Fino al rilascio di MySQL 5.5.5, InnoDB non è più un plug-in e ora fa parte del pacchetto MySQL come uno dei motori di archiviazione supportati per MySQL. Dal rilascio di MySQL 5.6, InnoDB è diventato il motore di archiviazione predefinito:è un motore di archiviazione per uso generico che bilancia elevata affidabilità e prestazioni elevate. I principali vantaggi di InnoDB includono il supporto del blocco a livello di riga, chiavi esterne e il modello ACID (Atomicity Consistency Isolation Durability):ACID è un insieme di proprietà che hanno lo scopo di garantire la validità dei dati nonostante errori, interruzioni di corrente e altri problemi. InnoDB ha un ampio elenco di variabili e alcune di queste aiutano a migliorare le prestazioni soprattutto sul tipo di hardware e sulle risorse disponibili del server del database. Tra questi ci sono:
- innodb_data_file_path è il file in cui sono archiviati i dati delle tabelle InnoDB.
- innodb_buffer_pool_size è un buffer di memoria che InnoDB utilizza per memorizzare nella cache i dati e gli indici delle sue tabelle.
- innodb_log_file_size rappresenta la dimensione dei file di registro di InnoDB. Maggiore è innodb_log_file_size, maggiore è il tempo di ripristino necessario in caso di arresto anomalo.
- innodb_log_buffer_size viene utilizzato da InnoDB per scrivere sui file di registro su disco.
- innodb_flush_log_at_trx_commit controlla l'equilibrio tra prestazioni e conformità ACID. Il valore predefinito è 1, che aiuta a mantenere la conformità di InnoDB ACID:impostando innodb_flush_log_at_trx_commit su 2 si ottiene una velocità di scrittura molto elevata, ma è possibile che si perda fino a un secondo di transazioni.
Ci sono anche impostazioni InnoDB avanzate che possono essere impostate per migliorare ulteriormente le prestazioni di MySQL. Li esamineremo ora.
Impostazioni avanzate di InnoDB
Come già notato sopra, InnoDB ha impostazioni avanzate che possono essere utilizzate per migliorarne ulteriormente le prestazioni (non le elencheremo assolutamente tutte, ma le impostazioni elencate dovrebbero darti un'idea abbastanza idea di quanto sia realmente potente InnoDB):
- InnoDB può essere disabilitato - se vuoi disabilitare InnoDB, modifica semplicemente il file my.cnf e aggiungi skip-innodb nella sezione [mysqld]. Dopodiché, riavvia il tuo server MySQL:ora InnoDB dovrebbe essere disabilitato. In alternativa, puoi utilizzare l'opzione --innodb:impostandola su OFF disabilita il motore. Tuttavia, tieni presente che queste opzioni sono deprecate a partire da MySQL 5.7.5.
- InnoDB fornisce anche un meccanismo di blocco configurabile che può migliorare le prestazioni delle istruzioni SQL che aggiungono righe alle tabelle con colonne AUTO_INCREMENT:le modalità di incremento automatico possono essere configurate all'avvio utilizzando l'opzione innodb_autoinc_lock_mode. L'opzione ha tre impostazioni per specificare la modalità di blocco:la modalità di blocco può essere 0 ("tradizionale"), 1 ("consecutiva") o 2 ("interlacciata"). I valori offrono prestazioni a seconda del tipo di inserimento nel database. In breve, 0 offre compatibilità con le versioni precedenti di MySQL e Innodb. Il valore 1 offre maggiore sicurezza e un approccio deterministico per la replica basata su istruzioni (SBR). Mentre il valore di 2 ha la modalità di blocco più scalabile e veloce, tuttavia le righe inserite da una determinata istruzione potrebbero non essere consecutive. Fare riferimento alla documentazione di MySQL per ulteriori informazioni.
- InnoDB offre la possibilità di dividere il pool di buffer in più segmenti (la funzionalità è disponibile solo da MySQL 5.5):l'impostazione innodb_buffer_pool_instances consente di migliorare la scalabilità di MySQL su macchine che eseguono più core. Per impostazione predefinita, il valore di questa impostazione è 1 se innodb_buffer_pool_size è inferiore a 1 GB e 8 in caso contrario:il numero specifica il numero di regioni in cui è suddiviso il pool di buffer InnoDB. Questa impostazione può essere utilizzata per coinvolgere più core, spiegheremo come in seguito.
- InnoDB offre quattro livelli di isolamento delle transazioni (tx_isolation in <5.7 ma transaction_isolation nella versione 5.7 in poi):READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ e SERIALIZABLE:questi livelli di isolamento sono la "I" nell'acronimo ACID :
- Quando è in uso READ UNCOMMITTED, una transazione potrebbe vedere modifiche non vincolate da un'altra transazione. Questo livello di isolamento consente letture sporche.
- Quando READ COMMITTED è in uso, puoi essere certo che tutti i dati letti sono stati salvati nel momento in cui sono stati letti.
- Quando è in uso REPEATABLE READ, è in uso un livello di isolamento più elevato. Oltre a tutto ciò che è garantito dal livello READ COMMITTED, garantisce anche che i dati già letti non possano essere modificati.
- Quando SERIALIZABLE è in uso, è in uso un livello di isolamento ancora più alto. Oltre a tutto ciò che è garantito dal livello di isolamento REPEATABLE READ, garantisce anche che nessun nuovo dato possa essere visto dalle letture successive.
- InnoDB consente inoltre di definire la capacità di I/O complessiva disponibile per InnoDB modificando la variabile innodb_io_capacity. Il valore di questa variabile deve essere impostato approssimativamente sul numero di IOPS che il sistema può eseguire al secondo:quando si imposta il valore di questo parametro, tenere presente che valori intorno a 100 sono più appropriati per gli HDD, mentre gli SSD potrebbero trarre vantaggio da valori più elevati . Anche la variabile innodb_io_capacity_max può essere di aiuto:questa variabile consente a InnoDB di svuotare in modo più aggressivo, il che significa che la velocità delle operazioni di I/O potrebbe superare il limite definito da innodb_io_capacity - in tali situazioni, le operazioni non supereranno il valore definito dalla variabile innodb_io_capacity_max .
- InnoDB consente inoltre di controllare quanti thread in background sono disponibili per le operazioni di I/O:il numero di thread di I/O allocati per le operazioni di lettura può essere controllato dalla variabile innodb_read_io_threads mentre il numero di I/O I thread assegnati alle operazioni di scrittura possono essere controllati dalla variabile innodb_write_io_threads. Il valore predefinito per entrambi questi parametri è 4 e il valore massimo consentito è 64.
- InnoDB ha la capacità di trasformare alcuni avvisi di InnoDB in errori:per farlo basta impostare la variabile innodb_strict_mode su ON:questa variabile influenza la gestione degli errori di sintassi per le operazioni CREATE TABLE, ALTER TABLE e CREATE INDEX :la disabilitazione di questa variabile potrebbe risolvere l'errore "Dimensione riga troppo grande". Per disabilitare la modalità rigorosa, imposta innodb_strict_mode su OFF.
- InnoDB può essere in qualche modo protetto contro scansioni complete di tabelle che interferiscono con i dati memorizzati nella cache nel buffer pool aumentando la variabile innodb_old_blocks_time. Il valore minimo per questa impostazione è 0, il valore predefinito è 1000.
- Se esegui operazioni di manutenzione su tabelle InnoDB che contengono indici FULLTEXT, considera di attivare la variabile innodb_optimize_fulltext_only - dopo che questa variabile è stata abilitata, la query OPTIMIZE TABLE dovrebbe essere eseguita più velocemente perché salterà la riorganizzazione dei dati sul tavolo. Tieni presente che questa impostazione deve essere abilitata solo temporaneamente, quindi potresti voler disattivarla una volta terminata l'ottimizzazione.
- Per avviare InnoDB in modalità di sola lettura, abilitare l'impostazione innodb_read_only. Quando questa impostazione è abilitata, puoi interrogare le tabelle InnoDB in cui la directory dei dati MySQL si trova su un supporto di sola lettura.
Fare in modo che InnoDB coinvolga più core
Puoi anche fare in modo che InnoDB coinvolga più core sfruttando le sue capacità di multithreading:sorprendentemente, questo non è molto difficile da ottenere:devi solo modificare un paio di impostazioni. Ecco come farlo:
- Lascia l'opzione innodb_thread_concurrency al suo valore predefinito 0. In questo modo lasci che InnoDB decida il miglior numero di ticket di concorrenza (determinano il numero di thread che possono entrare contemporaneamente in InnoDB) da aprire per un dato MySQL configurazione dell'istanza. Per MariaDB a partire dalla 10.5, è contrassegnato come deprecato, quindi avrebbe senso per MySQL impostarlo su 0 poiché le risorse di elaborazione sono state sofisticate rispetto ai primi giorni di MySQL.
- Una volta che l'opzione innodb_thread_concurrency è impostata su 0, imposta sia innodb_read_io_threads che innodb_write_io_threads al valore massimo di 64. Questo dovrebbe coinvolgere più core.
Riepilogo
Per riassumere, InnoDB è un motore di archiviazione estremamente potente. Le prestazioni di questo motore di archiviazione sono direttamente influenzate dalle impostazioni utilizzate da questo motore. Quindi, se desideri migliorare le prestazioni della tua istanza MySQL, assicurati di tenere a mente almeno alcuni dei suggerimenti menzionati in questo articolo. Regolare le impostazioni relative al motore e utilizzarle quando appropriato, così facendo dovrebbe darti un vantaggio.