Prácticas recomendadas de escalado y rendimiento de Aurora MySQL
Aplique las prácticas recomendadas que se describen a continuación para mejorar el rendimiento y la escalabilidad de los clústeres de Aurora MySQL.
Temas
Utilización de clases de instancia T para el desarrollo y la prueba
Las instancias de Amazon Aurora MySQL que utilizan las clases de instancia de base de datos db.t2
, db.t3
o db.t4g
son más adecuadas para las aplicaciones que no admiten una carga de trabajo elevada durante un periodo de tiempo largo. Las instancias T se han diseñado para ofrecer un desempeño de referencia moderado y la capacidad de poder ampliarlo a un nivel considerablemente superior si así lo exige la carga de trabajo. Están pensadas para las cargas de trabajo que no utilizan toda la CPU con frecuencia o de forma continua, pero que de vez en cuando necesitan ampliar sus procesos. Recomendamos que las clases de instancia de base de datos T se utilicen solo para los servidores de desarrollo y de pruebas, o para otros servidores que no se utilicen para la producción. Para obtener más detalles sobre las clases de instancia T, consulte Instancias de rendimiento ampliable.
Si el clúster de Aurora tiene más de 40 TB, no utilice las clases de instancia T. Cuando la base de datos tiene un gran volumen de datos, la sobrecarga de memoria para administrar objetos de esquema puede exceder la capacidad de la instancia T.
No habilite el esquema de rendimiento de MySQL en instancias T de Amazon Aurora MySQL. Si el esquema de desempeño está habilitado, la instancia T podría quedarse sin memoria.
sugerencia
Si la base de datos a veces está inactiva pero en otras ocasiones tiene una carga de trabajo sustancial, puede utilizar Aurora Serverless v2 como alternativa a las instancias T. Con Aurora Serverless v2, define un rango de capacidad y Aurora escala automáticamente la base de datos vertical y horizontalmente según la carga de trabajo actual. Para obtener más información sobre el uso, consulte Uso de Aurora Serverless v2. Para conocer las versiones del motor de base de datos que puede utilizar con Aurora Serverless v2, consulte Requisitos y limitaciones para Aurora Serverless v2.
Cuando utilice una instancia T como una instancia de base de datos en un clúster de base de datos de Aurora MySQL, recomendamos lo siguiente:
-
Utilice la misma clase de instancia de base de datos para todas las instancias del clúster de base de datos. Por ejemplo, si utiliza
db.t2.medium
para su instancia de escritor, le recomendamos que utilicedb.t2.medium
también para las instancias de lector. -
No ajuste ninguna configuración relacionada con la memoria, como, por ejemplo,
innodb_buffer_pool_size
. Aurora utiliza un conjunto de valores predeterminados muy ajustados para búferes de memoria en las instancias T. Estos valores predeterminados especiales son necesarios para que Aurora se pueda ejecutar en instancias con restricción de memoria. Si cambia cualquier configuración relacionada con la memoria en una instancia T, es mucho más probable que encuentre condiciones de falta de memoria, incluso si el cambio está destinado a aumentar el tamaño del búfer. -
Monitorice el saldo de crédito de su CPU (
CPUCreditBalance
) para asegurarse de que está en un nivel sostenible. Es decir, que los créditos de la CPU se están acumulando a la misma velocidad a la que se usan.Cuando se agotan los créditos de CPU correspondientes a una instancia, se percibe una disminución inmediata en la CPU disponible y un incremento en la latencia de lectura y escritura de la instancia. Esta situación provoca una grave reducción del desempeño general de la instancia.
Si el saldo de crédito de la CPU no está en un nivel sostenible, es recomendable que modifique la instancia de base de datos para que use una de las clases de instancia de base de datos R disponibles (escalado del cálculo).
Para obtener más información acerca de las métricas de monitorización, consulte Consulta de métricas en la consola de Amazon RDS.
-
Supervise el retardo de réplica (
AuroraReplicaLag
) entre la instancia de escritor y las instancias de lector.Si una instancia de lector se queda sin créditos de CPU antes de la instancia de escritor, el retraso resultante puede provocar que la instancia de lector se reinicie con frecuencia. Este resultado es habitual cuando una aplicación mantiene una carga elevada de operaciones de lectura distribuidas entre las instancias de lector al mismo tiempo que la instancia de escritor tiene una carga mínima de operaciones de escritura.
Si ve un aumento sostenido del retardo de las réplicas, asegúrese de que no se está agotando el saldo de crédito de la CPU para las instancias de lector en su clúster de base de datos.
Si el saldo de crédito de la CPU no está en un nivel sostenible, es recomendable que modifique la instancia de base de datos para que use una de las clases de instancia de base de datos R disponibles (escalado del cálculo).
-
Mantenga el número de inserciones por transacción por debajo de 1 millón para los clústeres de base de datos que tengan habilitado el registro binario.
Si el grupo de parámetros de su clúster de base de datos tiene el parámetro
binlog_format
definido en un valor distinto deOFF
, dicho clúster de base de datos puede experimentar condiciones de falta de memoria si recibe transacciones que contengan más de 1 millón de filas para insertar. Puede monitorizar la métrica de la memoria que se puede liberar (FreeableMemory
) para determinar si su clúster de base de datos se está quedando sin memoria. Luego puede comprobar la métrica de operaciones de escritura (VolumeWriteIOPS
) para ver si la instancia de escritura recibe una carga pesada de operaciones de escritura. En ese caso, es recomendable que actualice su aplicación para limitar el número de inserciones de una transacción a menos de 1 millón o que modifique la instancia para que utilice una de las clases de instancia de base de datos R compatibles (escalado del cálculo).
Optimización de las consultas de combinación indexadas de Aurora MySQL con la captura previa de claves asíncronas
Amazon MySQL puede usar la característica de captura previa de claves asíncronas (AKP, por sus siglas en inglés) para mejorar el desempeño de las consultas que unen las tablas a través de los índices. Esta característica mejora el rendimiento al prever las filas necesarias para ejecutar consultas en las que una consulta JOIN requiere el uso del algoritmo de combinación Batched Key Access (BKA) y las características de optimización Multi-Range Read (MRR). Para obtener más información acerca de BKA y MRR, consulte Block Nested-Loop and Batched Key Access Joins
Para sacar máximo partido de la característica AKP, una consulta debe utilizar BKA y MRR. Por lo general, dicho tipo de consulta se produce cuando la cláusula JOIN de una consulta utiliza un índice secundario, pero requiere también algunas columnas del índice primario. Por ejemplo, puede usar la AKP cuando una cláusula JOIN represente a un equijoin en los valores de índice entre una tabla exterior pequeña y una interior grande, y el índice sea sumamente selectivo en la tabla grande. AKP trabaja conjuntamente con BKA y MRR para llevar a cabo una búsqueda del índice secundario al primario durante la evaluación de la cláusula JOIN. AKP identifica las filas necesarias para ejecutar la consulta durante la evaluación de la cláusula JOIN. Seguidamente, utiliza un subproceso en segundo plano para cargar de manera asíncrona las páginas que contienen dichas filas en la memoria antes de ejecutar la consulta.
AKP está disponible para la versión 2.10 y posteriores y la versión 3 de Aurora MySQL. Para obtener más información acerca de las versiones de Aurora MySQL, consulte Actualizaciones del motor de base de datos de Amazon Aurora MySQL.
Habilitación de la captura previa de clave asíncrona
Para habilitar la característica de AKP, establezca la configuración aurora_use_key_prefetch
, una variable de MySQL Server, en on
. De forma predeterminada, este valor se establece en on
. No obstante, AKP no podrá habilitarse hasta que no active el algoritmo de combinación BKA y deshabilite la característica MRR basada en el costo. Para ello, debe ajustar los valores siguientes de optimizer_switch
, una variable de MySQL Server:
-
Establece
batched_key_access
enon
. Este valor controla el uso del algoritmo de combinación BKA. De forma predeterminada, este valor se establece enoff
. Establece
mrr_cost_based
enoff
. Este valor controla el uso de la característica MRR basada en el costo. De forma predeterminada, este valor se establece enon
.
En la actualidad, puede configurar estos valores únicamente en el nivel de sesión. El siguiente ejemplo ilustra cómo configurar estos valores a fin de habilitar AKP para la sesión actual ejecutando las instrucciones SET.
mysql>
set @@session.aurora_use_key_prefetch=on;mysql>
set @@session.optimizer_switch='batched_key_access=on,mrr_cost_based=off';
Del mismo modo, puede usar las instrucciones SET para deshabilitar AKP y el algoritmo de combinación BKA, y volver a habilitar la característica MRR basada en el costo para la sesión actual, como se muestra en el ejemplo siguiente.
mysql>
set @@session.aurora_use_key_prefetch=off;mysql>
set @@session.optimizer_switch='batched_key_access=off,mrr_cost_based=on';
Para obtener más información acerca de los cambios del optimizador batched_key_access y mrr_cost_based, consulte Switchable Optimizations
Optimización de consultas para la captura previa de clave asíncrona
Puede confirmar si una consulta puede beneficiarse de la característica AKP. Para ello, utilice la instrucción EXPLAIN
con el fin de perfilar la consulta antes de ejecutarla. La instrucción EXPLAIN
ofrece información acerca del plan de ejecución que se va a utilizar para una consulta especificada
En el resultado de la instrucción EXPLAIN
, la columna Extra
describe información adicional que se incluye con el plan de ejecución. Si la característica AKP se aplica a una tabla que se ha utilizado en la consulta, esta tabla incluye uno de los siguientes valores:
Using Key Prefetching
Using join buffer (Batched Key Access with Key Prefetching)
En el siguiente ejemplo se muestra el uso de EXPLAIN
para ver el plan de ejecución de una consulta que puede beneficiarse de AKP.
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)
Para obtener más información acerca del formato de salida EXPLAIN
, consulte el tema sobre el Formato de salida de EXPLAIN ampliado
Optimización de grandes consultas combinadas de Aurora MySQL con combinaciones hash
Si necesita unir una gran cantidad de datos mediante equijoin, una combinación hash puede mejorar el desempeño de las consultas. Puede habilitar las combinaciones hash para Aurora MySQL.
Una columna de combinación hash puede ser cualquier expresión compleja. En una columna de combinación hash puede realizar comparaciones entre distintos tipos de datos de las formas siguientes:
-
Puede comparar cualquier cosa en la categoría de tipos de datos numéricos precisos, como
int
,bigint
,numeric
ybit
. -
Puede comparar cualquier cosa en la categoría de tipos de datos numéricos aproximados, como
float
ydouble
. -
Puede comparar elementos en distintos tipos de cadena que tengan el mismo conjunto de caracteres y la misma intercalación.
-
Puede comparar elementos con tipos de datos de marca de fecha y hora si los tipos son los mismos.
nota
No se pueden comparar tipos de datos de categorías distintas.
Las siguientes restricciones se aplican a las combinaciones hash de Aurora MySQL:
-
Las uniones exteriores izquierda y derecha no son compatibles con la versión 2 de Aurora MySQL, pero sí con la versión 3.
-
No se admiten las semicombinaciones, como las subconsultas, a no ser que las subconsultas se materialicen primero.
-
No se admiten las actualizaciones o supresiones de varias tablas.
nota
Se admiten las actualizaciones o supresiones de una sola tabla.
-
Las columnas de tipos de datos especiales y BLOB no pueden ser columnas de unión en una combinación hash.
Habilitación de las combinaciones hash
Para habilitar combinaciones hash:
-
Aurora MySQL versión 2: establezca el parámetro de base de datos o el parámetro del clúster de base de datos
aurora_disable_hash_join
en0
. Siaurora_disable_hash_join
está desactivado, se establece el valor deoptimizer_switch
enhash_join=on
. -
Aurora MySQL versión 3: establezca el parámetro del servidor MySQL
optimizer_switch
enblock_nested_loop=on
.
Las combinaciones hash están activadas de forma predeterminada en la versión 3 de Aurora MySQL y están desactivadas de forma predeterminada en la versión 2 de Aurora MySQL. En el siguiente ejemplo, se ilustra cómo habilitar las combinaciones hash para la versión 3 de Aurora MySQL. Puede emitir la declaración select @@optimizer_switch
primero para ver qué otras configuraciones están presentes en la cadena del parámetro SET
. La actualización de un ajuste en el parámetro optimizer_switch
no borra ni modifica las demás configuraciones.
mysql>
SET optimizer_switch='block_nested_loop=on';
nota
Para Aurora MySQL, versión 3, se admite la combinación hash en todas las versiones secundarias y se activa de forma predeterminada.
Para la versión 2 de Aurora MySQL, se admiten combinaciones hash en todas las versiones secundarias. En Aurora MySQL versión 2, la característica de combinación hash siempre está controlada por el valor aurora_disable_hash_join
.
Con esta configuración, el optimizador elige usar una combinación hash basada en el costo, las características de la consulta y la disponibilidad de los recursos. Si la estimación del costo es incorrecta, puede forzar al optimizador a elegir una combinación hash. Para ello, establezca hash_join_cost_based
, una variable de MySQL Server, en off
. En el siguiente ejemplo se ilustra cómo forzar al optimizador a elegir una combinación hash.
mysql>
SET optimizer_switch='hash_join_cost_based=off';
nota
Esta configuración anula las decisiones del optimizador basado en costos. Aunque esta configuración puede ser útil para las pruebas y el desarrollo, le recomendamos que no la utilice en producción.
Optimización de consultas para combinaciones hash
Para averiguar si una consulta puede beneficiarse de usar una combinación hash, utilice antes la instrucción EXPLAIN
para perfilar la consulta. La instrucción EXPLAIN
ofrece información acerca del plan de ejecución que se va a utilizar para una consulta especificada
En el resultado de la instrucción EXPLAIN
, la columna Extra
describe información adicional que se incluye con el plan de ejecución. Si se aplica una combinación hash a las tablas utilizadas en la consulta, esta columna incluye valores similares a los siguientes:
Using where; Using join buffer (Hash Join Outer table
table1_name
)Using where; Using join buffer (Hash Join Inner table
table2_name
)
En el siguiente ejemplo se muestra el uso de EXPLAIN para ver el plan de ejecución de una consulta hash join (con combinación hash).
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)
En la salida, la Hash Join Inner table
es la tabla utilizada para crear la tabla hash y la Hash Join Outer table
es la tabla usada para sondear la tabla hash.
Para obtener más información acerca del formato de salida ampliado EXPLAIN
, consulte Extended EXPLAIN Output Format
En Aurora MySQL 2.08 y versiones posteriores, puede usar sugerencias SQL para influir en si una consulta usa combinación hash o no, y las tablas que usar para los lados de compilación y sondeo de la combinación. Para obtener más información, consulte Sugerencias de Aurora MySQL.
Uso de Amazon Aurora para escalar las lecturas de una base de datos de MySQL
Puede usar Amazon Aurora con su instancia de base de datos MySQL para aprovechar las capacidades de escalado de lectura de Amazon Aurora y ampliar la carga de trabajo de lectura para su instancia de base de datos MySQL. Si desea usar Aurora para leer la escala de su instancia de base de datos de MySQL, cree un clúster de base de datos de Aurora MySQL y haga que sea una réplica de lectura de su instancia de base de datos de MySQL. A continuación, conéctese al clúster Aurora MySQL para procesar las consultas de lectura. La base de datos de origen puede ser una instancia de base de datos de RDS for MySQL o una base de datos de MySQL que se ejecute fuera de Amazon RDS. Para obtener más información, consulte Escalado de lecturas para su base de datos MySQL con Amazon Aurora.
Optimización de las operaciones de marca temporal
Cuando el valor de la variable de sistema time_zone
se establece en SYSTEM
, cada llamada a una función de MySQL que requiera un cálculo de zona horaria realiza una llamada a la biblioteca del sistema. Al ejecutar instrucciones SQL que devuelvan o modifiquen dichos valores de TIMESTAMP
con una alta concurrencia, es posible que aumente la latencia, la contención de bloqueos y el uso de la CPU. Para obtener más información, consulte time_zone
Para evitar este comportamiento, se recomienda cambiar el valor del parámetro time_zone
del clúster de base de datos a UTC
. Para obtener más información, consulte Modificación de los parámetros en un grupo de parámetros de clúster de base de datos en Amazon Aurora.
Si bien el parámetro time_zone
es dinámico (no requiere el reinicio del servidor de base de datos), el nuevo valor solo se usará para las conexiones nuevas. Para asegurarse de que todas las conexiones se actualicen y utilicen el nuevo valor de time_zone
, se recomienda que recicle las conexiones de la aplicación después de actualizar el parámetro del clúster de base de datos.
Errores de desbordamiento de ID de índice virtual
Aurora MySQL limita los valores de los ID de índice virtuales a 8 bits para evitar un problema provocado por el formato de deshacer de MySQL. Si un índice supera el límite de ID de índice virtual, es posible que el clúster no esté disponible. Cuando un índice se acerca al límite de ID de índice virtual o cuando intenta crear un índice por encima del límite de ID de índice virtual, es posible que RDS arroje un código de error 63955
o un código de advertencia 63955
. Para solucionar un error de límite de ID de índice virtual, le recomendamos que vuelva a crear la base de datos con un volcado lógico y una restauración.
Para obtener más información sobre el volcado lógico y la restauración de Amazon Aurora MySQL, consulte Migrar bases de datos muy grandes a Amazon Aurora MySQL mediante MyDumper y MyLoader