Un índice solo puede indexar filas reales, no filas agregadas. Entonces, sí, en lo que respecta al índice deseado, crear una tabla con valores únicos como los que mencionaste es tu única opción. Hacer cumplir la integridad referencial con una restricción de clave externa de data.day
a days.day
. Esto podría también ser mejor para el rendimiento, dependiendo de la situación completa.
Sin embargo, dado que se trata de rendimiento , hay una solución alternativa:puede usar un CTE recursivo para emular un escaneo de índice suelto:
WITH RECURSIVE cte AS (
( -- parentheses required
SELECT day FROM data ORDER BY 1 LIMIT 1
)
UNION ALL
SELECT (SELECT day FROM data WHERE day > c.day ORDER BY 1 LIMIT 1)
FROM cte c
WHERE c.day IS NOT NULL -- exit condition
)
SELECT day FROM cte;
Paréntesis alrededor del primer SELECT
son obligatorios debido al ORDER BY
adjunto y LIMIT
cláusulas. Ver:
Esto solo necesita un índice simple en day
.
Hay varias variantes, dependiendo de sus consultas reales:
- Optimizar la consulta GROUP BY para recuperar la fila más reciente por usuario
- Índice no utilizado en consulta de rango de fechas
- Seleccionar primero fila en cada grupo GROUP BY?
Más en mi respuesta a su pregunta de seguimiento: