Index může indexovat pouze skutečné řádky, nikoli agregované řádky. Takže ano, pokud jde o požadovaný index, jedinou možností je vytvoření tabulky s jedinečnými hodnotami, jak jste zmínil. Vynutit referenční integritu pomocí omezení cizího klíče z data.day
na days.day
. Toto může také nejlepší pro výkon v závislosti na celkové situaci.
Protože se však jedná o výkon , existuje alternativní řešení:můžete použít rekurzivní CTE k emulaci volného skenování indexu:
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;
Závorky kolem prvního SELECT
jsou vyžadovány z důvodu připojeného ORDER BY
a LIMIT
doložky. Viz:
To vyžaduje pouze prostý index v day
.
Existují různé varianty v závislosti na vašich skutečných dotazech:
- Optimalizace dotazu GROUP BY pro načtení nejnovějšího řádku na uživatele
- Dotaz Nepoužitý index v rozsahu dat
- Vyberte nejdříve řádek v každé skupině GROUP BY?
Více v mé odpovědi na váš doplňující dotaz: