Un index ne peut indexer que des lignes réelles, pas des lignes agrégées. Donc, oui, en ce qui concerne l'index souhaité, la création d'une table avec des valeurs uniques comme vous l'avez mentionné est votre seule option. Appliquer l'intégrité référentielle avec une contrainte de clé étrangère de data.day
à days.day
. Cela pourrait également être le meilleur pour les performances, en fonction de la situation complète.
Cependant, puisqu'il s'agit de performances , il existe une solution alternative :vous pouvez utiliser un CTE récursif pour émuler un balayage d'index lâche :
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;
Parenthèses autour du premier SELECT
sont requis en raison du ORDER BY
ci-joint et LIMIT
clauses. Voir :
Cela ne nécessite qu'un index simple le day
.
Il existe différentes variantes, en fonction de vos requêtes réelles :
- Optimiser la requête GROUP BY pour récupérer la dernière ligne par utilisateur
- Index inutilisé dans la requête de plage de dates
- Sélectionner d'abord rangée dans chaque groupe GROUP BY ?
Plus dans ma réponse à votre question de suivi :