es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La consulta rápida MySQL se vuelve muy lenta al agregar SUM.

Tengo esta consulta, que se ejecuta en AWS Aurora, en modo MySQL, y es muy rápida (100 ms):

select rv.kind, rv.sub_kind, count(*)
from revenues rv
where rv.paid_at = '2021-11-17'
group by rv.kind, rv.sub_kind;

Sin embargo, si agrego una suma, se vuelve MUY lenta (1 minuto y 20 segundos):

select rv.kind, rv.sub_kind, count(*), sum(iugu_fee_cents)
from revenues rv
where rv.paid_at = '2021-11-17'
group by rv.kind, rv.sub_kind;

Es una consulta simple, y tengo un índice compuesto que incluye paid_at, kind y sub_kind, en ese orden. Al utilizar la orden EXPLAIN en ambas consultas, se confirma que se está utilizando el índice.

La otra información es la misma para ambas consultas, excepto la columna Extra, que muestra Using where; Using index para la consulta rápida, y Using index condition en la consulta lenta.

¿Hay algo que pueda hacer para solucionar este problema?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Basándonos en la información proporcionada, parece que la adición de la función sum está causando un rendimiento lento de la consulta. Una posible solución para optimizar la consulta sería crear un nuevo índice que incluya la columna iugu_fee_cents además del índice existente en paid_at, kind y sub_kind.

    Otra solución podría ser reescribir la consulta utilizando una subconsulta para precalcular la suma y luego unir el resultado con la consulta original. Esto puede ayudar a evitar el cálculo de la suma para cada fila en el conjunto de resultados.

    Por ejemplo:

    select rv.kind, rv.sub_kind, rv.count, s.total_sum
    from (
      select kind, sub_kind, count(*), sum(iugu_fee_cents) as total_sum
      from revenues
      where paid_at = '2021-11-17'
      group by kind, sub_kind
    ) s
    join revenues rv on rv.kind = s.kind and rv.sub_kind = s.sub_kind
    where rv.paid_at = '2021-11-17';
    

    Esta consulta primero calcula la cantidad y suma para cada combinación de kind y sub_kind, y luego une el resultado con la tabla original para recuperar las cantidades correspondientes. Esto puede ser potencialmente más rápido que calcular la suma para cada fila en la tabla original.

    En general, la mejor solución dependerá de las características específicas de los datos y la carga de trabajo. Puede ser útil experimentar con diferentes configuraciones de índices y patrones de consulta para encontrar el enfoque más eficiente.

Comments are closed.