Le migliori pratiche per Aurora My: SQL prestazioni e scalabilità - Amazon Aurora

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à.

Le migliori pratiche per Aurora My: SQL prestazioni e scalabilità

Puoi applicare le seguenti best practice per migliorare le prestazioni e la scalabilità dei tuoi cluster Aurora MySQL.

Utilizzo delle classi di istanza T per lo sviluppo e i test

Amazon Aurora Le mie SQL istanze che utilizzano le classi di istanze db.t2db.t3, o db.t4g DB sono più adatte per applicazioni che non supportano un carico di lavoro elevato per un periodo di tempo prolungato. Le istanze T sono progettate per offrire prestazioni di base moderate e garantire prestazioni notevolmente maggiori se il carico di lavoro lo richiede. Sono destinate a carichi di lavoro che non vengono utilizzati completamente CPU spesso o costantemente, ma che a volte devono esplodere. Consigliamo di utilizzare le classi di istanza database T solo per i server di sviluppo e test o altri server non di produzione. Per ulteriori informazioni sulle classi di istanze T, consulta Istanze espandibili.

Se il cluster Aurora è più grande di 40 TB, non utilizzare le classi di istanza T. Quando il database dispone di un volume elevato di dati, il sovraccarico di memoria per la gestione degli oggetti dello schema può superare la capacità di un'istanza T.

Non abilitare My SQL Performance Schema sulle istanze My SQL T di Amazon Aurora. In caso contrario, è possibile che la memoria disponibile per l'istanza T potrebbe esaurirsi.

Suggerimento

Se il tuo database a volte è inattivo ma altre volte ha un carico di lavoro notevole, puoi utilizzare Aurora Serverless v2 in alternativa alle istanze T. Con Aurora Serverless v2, definisci un intervallo di capacità e Aurora ridimensiona automaticamente il database verso l'alto o verso il basso a seconda del carico di lavoro corrente. Per informazioni dettagliate sull'utilizzo, consulta Uso di Aurora Serverless v2. Per le versioni del motore di database che è possibile utilizzare con Aurora Serverless v2, consulta Requisiti e limitazioni per Aurora Serverless v2.

Quando si utilizza un'istanza T come istanza DB in un cluster Aurora My SQL DB, si consiglia quanto segue:

  • Utilizza la stessa classe di istanza database per tutte le istanze nel cluster di database. Ad esempio, se si utilizza db.t2.medium per l'istanza di scrittura, allora si consiglia di usare db.t2.medium anche per le istanze di lettura.

  • Non regolare le impostazioni di configurazione relative alla memoria, ad esempio innodb_buffer_pool_size. Aurora utilizza un insieme altamente sintonizzato di valori di default per i buffer di memoria sulle istanze T. Questi valoridi di default speciali sono necessari per consentire l'esecuzione di Aurora su istanze vincolate dalla memoria. Se si modificano le impostazioni relative alla memoria su un'istanza T, è molto più probabile che si verifichino out-of-memory condizioni, anche se la modifica è intesa ad aumentare le dimensioni del buffer.

  • Monitora il tuo saldo CPU di credito (CPUCreditBalance) per assicurarti che sia a un livello sostenibile. Cioè, i CPU crediti vengono accumulati alla stessa velocità con cui vengono utilizzati.

    Una volta esauriti i CPU crediti di un'istanza, si verifica un calo immediato di quelli disponibili CPU e un aumento della latenza di lettura e scrittura dell'istanza. Questa situazione provoca un'importante riduzione delle prestazioni complessive dell'istanza.

    Se il tuo saldo CPU di credito non è a un livello sostenibile, ti consigliamo di modificare l'istanza DB per utilizzare una delle classi di istanze R DB supportate (calcolo della scala).

    Per ulteriori informazioni sui parametri di monitoraggio, consulta Visualizzazione delle metriche nella console Amazon RDS.

  • Monitora il ritardo di replica (AuroraReplicaLag) tra l'istanza di scrittura e le istanze di lettura.

    Se un'istanza reader esaurisce i CPU crediti prima dell'istanza writer, il ritardo risultante può causare il riavvio frequente dell'istanza Reader. Si tratta di un risultato comune nei casi in cui un'applicazione dispone di un carico elevato di operazioni di lettura distribuito tra le istanze di lettura, allo stesso tempo che l'istanza di scrittura presenta un carico minimo di operazioni di scrittura.

    Se riscontri un aumento costante del ritardo di replica, assicurati che il saldo del CPU credito per le istanze Reader nel cluster DB non sia esaurito.

    Se il tuo saldo CPU di credito non è a un livello sostenibile, ti consigliamo di modificare l'istanza DB per utilizzare una delle classi di istanze R DB supportate (calcolo della scala).

  • Mantenere il numero di inserimenti per transazione al di sotto di 1 milione per i cluster di database per cui è abilitata la registrazione binaria.

    Se il gruppo di parametri del cluster DB per il tuo cluster DB ha il binlog_format parametro impostato su un valore diverso daOFF, il cluster DB potrebbe presentare out-of-memory delle condizioni se il cluster DB riceve transazioni che contengono più di 1 milione di righe da inserire. È possibile monitorare il parametro della memoria da liberare (FreeableMemory) per determinare se la memoria disponibile per il cluster di database sta per esaurire. Controllando quindi il parametro delle operazioni di scrittura (VolumeWriteIOPS) sarà possibile verificare se l'istanza di scrittura riceve un carico elevato di operazioni di scrittura. In tal caso, consigliamo di aggiornare l'applicazione per limitare gli inserimenti in una transazione a un numero inferiore a 1 milione. In alternativa, è possibile modificare l'istanza in modo da utilizzare una delle classi di istanza database R supportate (dimensionamento del calcolo).

Ottimizzazione delle query di join indicizzate di Aurora SQL My con prefetch a chiave asincrona

Aurora My SQL può utilizzare la funzionalità a chiave asincrona prefetch (AKP) per migliorare le prestazioni delle query che uniscono le tabelle tra gli indici. Questa funzionalità migliora le prestazioni anticipando le righe necessarie per eseguire le query in cui una JOIN query richiede l'uso dell'algoritmo Batched Key Access () Join e delle funzionalità di ottimizzazione Multi-Range Read (). BKA MRR Per ulteriori informazioni su BKA eMRR, vedete Block nested-loop e batched key access join e Multi-range read optimization nella mia documentazione. SQL

Per sfruttare AKP questa funzionalità, una query deve utilizzare entrambi e. BKA MRR In genere, tale query si verifica quando la JOIN clausola di una query utilizza un indice secondario, ma richiede anche alcune colonne dell'indice primario. Ad esempio, è possibile utilizzare AKP quando una JOIN clausola rappresenta un equijoin sui valori di indice tra una piccola tabella esterna e una grande tabella interna e l'indice è altamente selettivo sulla tabella più grande. AKPcollabora BKA ed MRR esegue una ricerca dell'indice secondario rispetto a quello primario durante la valutazione della clausola. JOIN AKPidentifica le righe necessarie per eseguire l'interrogazione durante la valutazione della clausola. JOIN Utilizza quindi un thread in background per caricare in modo asincrono le pagine contenenti le righe in memoria prima di eseguire la query.

AKPè disponibile per Aurora My SQL versione 2.10 e successive e versione 3. Per ulteriori informazioni sulle SQL versioni di Aurora My, consulta. Aggiornamenti del motore di database per Amazon Aurora My SQL

Abilitazione del prefetch asincrono delle chiavi

È possibile abilitare la AKP funzionalità aurora_use_key_prefetch impostando una variabile My SQL server suon. Per impostazione predefinita, questo valore è impostato su on. Tuttavia, non AKP può essere abilitata finché non abiliti anche l'algoritmo BKA Join e disabiliti la MRR funzionalità basata sui costi. A tale scopo, è necessario impostare i seguenti valori per optimizer_switch una variabile My SQL server:

  • Imposta batched_key_access su on. Questo valore controlla l'uso dell'algoritmo BKA Join. Per impostazione predefinita, questo valore è impostato su off.

  • Imposta mrr_cost_based su off. Questo valore controlla l'uso di MRR funzionalità basate sui costi. Per impostazione predefinita, questo valore è impostato su on.

È attualmente possibile impostare questi valori solo a livello di sessione. L'esempio seguente illustra come impostare questi valori in modo che siano abilitati AKP per la sessione corrente SET eseguendo istruzioni.

mysql> set @@session.aurora_use_key_prefetch=on; mysql> set @@session.optimizer_switch='batched_key_access=on,mrr_cost_based=off';

Analogamente, è possibile utilizzare SET le istruzioni per disabilitare AKP l'algoritmo BKA Join e riattivare la MRR funzionalità basata sui costi per la sessione corrente, come illustrato nell'esempio seguente.

mysql> set @@session.aurora_use_key_prefetch=off; mysql> set @@session.optimizer_switch='batched_key_access=off,mrr_cost_based=on';

Per ulteriori informazioni sugli switch di ottimizzazione batched_key_access e mrr_cost_based, vedere Ottimizzazioni commutabili nella documentazione personale. SQL

Ottimizzazione delle query per il prefetch asincrono delle chiavi

È possibile confermare se una query può sfruttare AKP la funzionalità. A tale scopo, utilizza l'istruzione EXPLAIN per profilare la query prima di eseguirla. L'istruzione EXPLAIN fornisce informazioni sul piano di esecuzione da utilizzare per una query specificata.

Nell'output dell'istruzione EXPLAIN la colonna Extra descrive le informazioni aggiuntive incluse nel piano di esecuzione. Se la AKP funzionalità si applica a una tabella utilizzata nella query, questa colonna include uno dei seguenti valori:

  • Using Key Prefetching

  • Using join buffer (Batched Key Access with Key Prefetching)

L'esempio seguente mostra l'utilizzo di EXPLAIN per visualizzare il piano di esecuzione di una query di cui è possibile trarre vantaggioAKP.

mysql> explain select sql_no_cache -> ps_partkey, -> sum(ps_supplycost * ps_availqty) as value -> from -> partsupp, -> supplier, -> nation -> where -> ps_suppkey = s_suppkey -> and s_nationkey = n_nationkey -> and n_name = 'ETHIOPIA' -> group by -> ps_partkey having -> sum(ps_supplycost * ps_availqty) > ( -> select -> sum(ps_supplycost * ps_availqty) * 0.0000003333 -> from -> partsupp, -> supplier, -> nation -> where -> ps_suppkey = s_suppkey -> and s_nationkey = n_nationkey -> and n_name = 'ETHIOPIA' -> ) -> order by -> value desc; +----+-------------+----------+------+-----------------------+---------------+---------+----------------------------------+------+----------+-------------------------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+----------+------+-----------------------+---------------+---------+----------------------------------+------+----------+-------------------------------------------------------------+ | 1 | PRIMARY | nation | ALL | PRIMARY | NULL | NULL | NULL | 25 | 100.00 | Using where; Using temporary; Using filesort | | 1 | PRIMARY | supplier | ref | PRIMARY,i_s_nationkey | i_s_nationkey | 5 | dbt3_scale_10.nation.n_nationkey | 2057 | 100.00 | Using index | | 1 | PRIMARY | partsupp | ref | i_ps_suppkey | i_ps_suppkey | 4 | dbt3_scale_10.supplier.s_suppkey | 42 | 100.00 | Using join buffer (Batched Key Access with Key Prefetching) | | 2 | SUBQUERY | nation | ALL | PRIMARY | NULL | NULL | NULL | 25 | 100.00 | Using where | | 2 | SUBQUERY | supplier | ref | PRIMARY,i_s_nationkey | i_s_nationkey | 5 | dbt3_scale_10.nation.n_nationkey | 2057 | 100.00 | Using index | | 2 | SUBQUERY | partsupp | ref | i_ps_suppkey | i_ps_suppkey | 4 | dbt3_scale_10.supplier.s_suppkey | 42 | 100.00 | Using join buffer (Batched Key Access with Key Prefetching) | +----+-------------+----------+------+-----------------------+---------------+---------+----------------------------------+------+----------+-------------------------------------------------------------+ 6 rows in set, 1 warning (0.00 sec)

Per ulteriori informazioni sul formato EXPLAIN di output, vedere Formato EXPLAIN di output esteso nella SQL documentazione personale.

Ottimizzazione delle query Aurora SQL My join di grandi dimensioni con hash join

Se devi eseguire il join di una grande quantità di dati tramite una query equijoin, l'utilizzo di un hash join può migliorare le prestazioni della query. Puoi abilitare gli hash join per Aurora My. SQL

Una colonna hash join può essere una qualsiasi espressione complessa. Di seguito sono indicati i modi per eseguire il confronto tra i tipi di dati in una colonna hash join:

  • È possibile confrontare qualsiasi elemento nella categoria dei tipi di dati numerici precisi, ad esempio int, bigint, numeric e bit.

  • È possibile confrontare qualsiasi elemento nella categoria dei tipi di dati numerici di approssimazione, ad esempio float e double.

  • È possibile confrontare elementi nei tipi di stringa, se i tipi di stringa dispongono dello stesso set di caratteri e delle stesse regole di confronto.

  • È possibile confrontare elementi con tipi di dati data e timestamp, se i tipi corrispondono.

Nota

Non è possibile confrontare i tipi di dati in categorie differenti.

Le seguenti restrizioni si applicano agli hash join per Aurora My: SQL

  • I join esterni sinistra-destra non sono supportati per Aurora My SQL versione 2, ma sono supportati per la versione 3.

  • I semi-join come le query secondarie non sono supportati, a meno che non vengano prima materializzate le query secondarie.

  • Aggiornamenti o eliminazioni di più tabelle non sono supportati.

    Nota

    Aggiornamenti o eliminazioni di tabelle singole sono supportati.

  • BLOBe le colonne con tipi di dati spaziali non possono essere colonne unite in un hash join.

Abilitazione di hash join

Per abilitare gli hash join:

  • Aurora My SQL version 2: imposta il parametro DB o il parametro del cluster DB suaurora_disable_hash_join. 0 La disattivazione di aurora_disable_hash_join imposta il valore di optimizer_switch su hash_join=on.

  • Aurora My SQL version 3: imposta il parametro optimizer_switch My SQL server su. block_nested_loop=on

Gli hash join sono attivati per impostazione predefinita in Aurora My SQL versione 3 e disattivati per impostazione predefinita in Aurora My versione 2. SQL L'esempio seguente illustra come abilitare gli hash join per Aurora My versione 3. SQL È possibile rilasciare l’istruzione select @@optimizer_switch per prima cosa per vedere quali altre impostazioni sono presenti nella stringa dei parametri di SET. Aggiornamento di un'impostazione nel parametro di optimizer_switch non cancella o modifica le altre impostazioni.

mysql> SET optimizer_switch='block_nested_loop=on';
Nota

Per Aurora My SQL versione 3, il supporto hash join è disponibile in tutte le versioni secondarie ed è attivato per impostazione predefinita.

Per Aurora My SQL versione 2, il supporto hash join è disponibile in tutte le versioni minori. In Aurora My SQL versione 2, la funzionalità hash join è sempre controllata dal valore. aurora_disable_hash_join

Con questa impostazione, l'ottimizzatore sceglie di utilizzare un hash join in base al costo, alle caratteristiche della query e alla disponibilità delle risorse. Se la stima dei costi non è corretta, puoi imporre all'ottimizzatore di scegliere un hash join, Puoi farlo hash_join_cost_based impostando una variabile My SQL server su. off L'esempio seguente illustra come imporre all'ottimizzatore di scegliere un hash join.

mysql> SET optimizer_switch='hash_join_cost_based=off';
Nota

Questa impostazione sostituisce le decisioni dell'ottimizzatore basato sui costi. Sebbene l'impostazione possa essere utile per il test e lo sviluppo, si consiglia di non utilizzarla in produzione.

Ottimizzazione delle query per gli hash join

Per sapere se una query può utilizzare un hash join, è possibile utilizzare in primo luogo l'istruzione EXPLAIN per profilare la query. L'istruzione EXPLAIN fornisce informazioni sul piano di esecuzione da utilizzare per una query specificata.

Nell'output dell'istruzione EXPLAIN la colonna Extra descrive le informazioni aggiuntive incluse nel piano di esecuzione. Se un hash join si applica alle tabelle utilizzate nella query, questa colonna include valori simili a quelli indicato di seguito:

  • Using where; Using join buffer (Hash Join Outer table table1_name)

  • Using where; Using join buffer (Hash Join Inner table table2_name)

L'esempio seguente mostra l'utilizzo di EXPLAIN per visualizzare il piano di esecuzione di una query hash join.

mysql> explain SELECT sql_no_cache * FROM hj_small, hj_big, hj_big2 -> WHERE hj_small.col1 = hj_big.col1 and hj_big.col1=hj_big2.col1 ORDER BY 1; +----+-------------+----------+------+---------------+------+---------+------+------+----------------------------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+----------+------+---------------+------+---------+------+------+----------------------------------------------------------------+ | 1 | SIMPLE | hj_small | ALL | NULL | NULL | NULL | NULL | 6 | Using temporary; Using filesort | | 1 | SIMPLE | hj_big | ALL | NULL | NULL | NULL | NULL | 10 | Using where; Using join buffer (Hash Join Outer table hj_big) | | 1 | SIMPLE | hj_big2 | ALL | NULL | NULL | NULL | NULL | 15 | Using where; Using join buffer (Hash Join Inner table hj_big2) | +----+-------------+----------+------+---------------+------+---------+------+------+----------------------------------------------------------------+ 3 rows in set (0.04 sec)

Nell'output Hash Join Inner table indica la tabella utilizzata per creare la tabella hash e Hash Join Outer table indica la tabella utilizzata per il probe della tabella hash.

Per ulteriori informazioni sul formato di EXPLAIN output esteso, vedere Extended EXPLAIN Output Format nella documentazione del mio SQL prodotto.

In Aurora My SQL 2.08 e versioni successive, è possibile utilizzare i SQL suggerimenti per determinare se una query utilizza o meno l'hash join e quali tabelle utilizzare per i lati build e probe del join. Per informazioni dettagliate, consultare Aurora I miei suggerimenti SQL.

Utilizzo di Amazon Aurora per ridimensionare le letture per il tuo database My SQL

Puoi usare Amazon Aurora con la tua istanza My SQL DB per sfruttare le funzionalità di scalabilità di lettura di Amazon Aurora ed espandere il carico di lavoro di lettura per la tua istanza My DB. SQL Per usare Aurora per scalare in lettura la tua istanza My SQL DB, crea un cluster Aurora My SQL DB e rendilo una replica di lettura della tua istanza My DB. SQL Quindi connettiti al SQL cluster Aurora My per elaborare le query di lettura. Il database di origine può essere un'istanza RDS for My SQL DB o un SQL database My in esecuzione all'esterno di AmazonRDS. Per ulteriori informazioni, consulta Ridimensionamento delle letture per il tuo SQL database My con Amazon Aurora.

Ottimizzazione delle operazioni di timestamp

Quando il valore della variabile di sistema time_zone è impostato suSYSTEM, ogni chiamata alla SQL funzione My che richiede un calcolo del fuso orario effettua una chiamata alla libreria di sistema. Quando si eseguono SQL istruzioni che restituiscono o modificano tali TIMESTAMP valori con una elevata contemporaneità, è possibile che si verifichino un aumento della latenza, del conflitto di blocchi e dell'utilizzo. CPU Per ulteriori informazioni, consulta time_zone nella documentazione personale. SQL

Per evitare questo comportamento, consigliamo di modificare il valore del parametro time_zone del cluster database impostandolo su UTC. Per ulteriori informazioni, consulta Modifica dei parametri in un gruppo di parametri del cluster DB in Amazon Aurora.

Sebbene il parametro time_zone sia dinamico (non richiede il riavvio del server di database), il nuovo valore viene utilizzato solo per le nuove connessioni. Per assicurarti che tutte le connessioni siano aggiornate in modo che venga utilizzato il nuovo valore time_zone, consigliamo di riciclare le connessioni alle applicazioni dopo aver aggiornato il parametro del cluster database.