Saltar al contenido

Mi consulta tarda 30 segundos, ¿por dónde empiezo a investigar?

Vicky_2011

Nivel 3 ·

Tengo una tabla de movimientos con unos 20 millones de filas. Esta consulta tarda una eternidad: SELECT * FROM movimientos WHERE YEAR(fecha) = 2023 AND cuenta_id = 4521; Hay índice en fecha y otro en cuenta_id. ¿Qué hago?
124 vistas 7 respuestas 0 0

Respuestas 7

  1. Martín B.

    Nivel 2 ·

    0 0

    Primero, EXPLAIN (o EXPLAIN ANALYZE) para ver qué plan usa. Sin eso es adivinar.

  2. Damián R.

    Nivel 3 ·

    0 0

    Lo más probable: YEAR(fecha) envuelve la columna en una función y entonces el índice sobre fecha no se puede usar. Reescribilo como rango: WHERE fecha >= '2023-01-01' AND fecha < '2024-01-01'

  3. Yuliana S.

    Nivel 1 ·

    0 0

    Además, un índice compuesto (cuenta_id, fecha) probablemente sea mucho mejor que dos índices separados para este filtro.

  4. Jazmín C.

    Nivel 3 ·

    0 0

    Y evitá el SELECT * si no necesitás todas las columnas, sobre todo si hay columnas pesadas de texto.

  5. Vicky_2011

    Nivel 3 ·

    0 0

    Pasé el YEAR() a rango y bajó de 30 segundos a menos de 1. No lo podía creer. Ahora pruebo el compuesto.

  6. antonella F.

    Nivel 2 ·

    0 0

    Ese patrón (función sobre columna indexada) es el error de rendimiento número uno que veo en code reviews.

  7. Stiven

    Nivel 2 ·

    0 0

    Algunos motores permiten índices sobre expresiones, pero el rango es más limpio y portable.