Ett index kan bara indexera faktiska rader, inte aggregerade rader. Så, ja, vad gäller det önskade indexet är det enda alternativet att skapa en tabell med unika värden som du nämnde. Framtvinga referensintegritet med en främmande nyckel-begränsning från data.day
till days.day
. Detta kan också vara bäst för prestanda, beroende på hela situationen.
Men eftersom det handlar om prestanda , det finns en alternativ lösning:du kan använda en rekursiv CTE för att emulera en lös indexskanning:
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;
Parentes runt den första SELECT
krävs på grund av den bifogade ORDER BY
och LIMIT
klausuler. Se:
Detta behöver bara ett vanligt index på day
.
Det finns olika varianter, beroende på dina faktiska frågor:
- Optimera GROUP BY-fråga för att hämta senaste raden per användare
- Oanvänt index inom datumintervallfråga
- Välj först rad i varje GROUP BY-grupp?
Mer i mitt svar på din följdfråga: