

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Ottimizzazione dei carichi di lavoro di scrittura
<a name="tune-write-workloads"></a>

Implementare il bilanciamento del carico e liberare l'istanza di scrittura aiuteranno il carico di lavoro di scrittura a migliorare le prestazioni durante i picchi elevati. Per ottenere prestazioni di scrittura migliori in presenza di elevata simultaneità, segui i seguenti passaggi aggiuntivi.

## Sposta l'integrità referenziale nel livello applicativo
<a name="referential-integrity"></a>

Sebbene i controlli dell'integrità referenziale siano importanti, con l'hyperscale possono influire negativamente sul carico. Prima di eseguire ogni scrittura è necessario eseguire scansioni aggiuntive, e ciò si traduce in prestazioni scadenti. Se l'applicazione richiede controlli di integrità rigorosi, inseriscili nel livello applicativo per evitare che limitino le operazioni di scrittura.

## Evita di usare chiavi primarie pesanti
<a name="primary-keys"></a>

Mantieni leggere le chiavi primarie. Il motore di archiviazione InnoDB aggiunge la chiave primaria a ogni altro indice creato nella tabella. Quando la chiave primaria è grande, influisce sulla dimensione dell'indice. Se la chiave primaria è piuttosto grande, l'archiviazione e il recupero delle pagine di dati rallenteranno. Un esempio comune è l'uso di identificatori univoci universali come chiavi primarie. Non si tratta di un buon approccio se si punta alle prestazioni in un ambiente iperdimensionato.

## Usa lo scambio di partizioni per caricare i dati in tabelle partizionate
<a name="partition-exchange"></a>

Se stai scrivendo grandi set di dati in tabelle partizionate, la combinazione di [LOAD DATA FROM S3](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Integrating.LoadFromS3.html) e [scambio di partizioni](https://dev.mysql.com/doc/refman/5.7/en/partitioning-management-exchange.html) può migliorare le prestazioni, poiché non è possibile accedere alla tabella principale per gli inserti. Lo scambio di partizioni prevede un DDL (data definition language) e inserisce un blocco dei metadati sulla tabella. Assicurati che ciò avvenga quando le query in esecuzione sulla tabella sono minime o assenti, in modo che il DDL dello scambio di partizioni possa ottenere il blocco dei metadati senza attese. Il completamento dello scambio richiede pochi millisecondi.

## Rimuovere gli indici inutilizzati
<a name="unused-indexes"></a>

[InnoDB](https://dev.mysql.com/doc/refman/8.0/en/innodb-storage-engine.html) ottimizza i suoi piani di query in base alla crescita dei dati, ed è consigliabile controllare gli indici inutilizzati nel database e rimuoverli. Gli indici non utilizzati consumano IO quando l'applicazione scrive dati in una tabella. Controlla l'elenco degli indici non utilizzati e verifica che non si tratti di indici utilizzati in situazioni rare, come i report trimestrali. Tieni inoltre presente che devono essere presi in considerazione anche alcuni indici che vengono utilizzati per applicare l'unicità o l'ordinamento.

## Assicurati che le versioni di riga precedenti vengano eliminate in modo efficiente
<a name="old-row-versions"></a>

Nell'implementazione InnoDB del controllo della concorrenza multiversione (MVCC), quando viene modificato un record, la versione (precedente) corrente dei dati modificati viene prima registrata come *record di annullamento* in un log di annullamenti. Un valore della lunghezza dell'elenco della cronologia (HHL) indica che i thread di rimozione di oggetti inutili (thread di rimozione) di InnoDB non stanno al passo con il carico di lavoro di scrittura o che l'eliminazione è bloccata da una query o transazione di lunga durata. Quando la rimozione di oggetti inutili viene bloccata o ritardata, il database può sviluppare un notevole ritardo di rimozione che può influire negativamente sulle prestazioni delle query. È possibile usare i seguenti consigli per ottimizzare il processo di eliminazione.
+ Mantieni le transazioni piccole.
+ Per le query di lettura, usa il livello di isolamento READ COMMITTED.
+ Aumenta il numero di thread di rimozione ([innodb\_purge\_threads](https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_purge_threads) e [innodb\_purge\_batch\_size](https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_purge_batch_size)). Nota che l'ottimizzazione di questi parametri richiede un riavvio.
+ Monitora regolarmente l'HLL e risolvi eventuali problemi di carico di lavoro che impediscono il proseguimento della rimozione di oggetti inutili.

## Assicurati che la registrazione non generi ulteriori contese
<a name="logging"></a>

Il log generale delle query registra le connessioni e le disconnessioni dei client, oltre a tutte le istruzioni ricevute dal server nell'ordine in cui sono state ricevute. Se attivata, la registrazione è sincrona, il che può comportare un notevole calo delle prestazioni su un sistema occupato. A meno che non sia necessario, si consiglia di disattivare il log generale.

Il log delle query lente registra le istruzioni che hanno richiesto più secondi del [valore long\_query\_time](https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_long_query_time) per essere eseguite, con l'impostazione predefinita di 10 secondi. Quando l'impostazione è su 0, tutte le istruzioni vengono registrate in modo sincrono, il che può comportare un calo delle prestazioni nei database occupati.