Un indice può indicizzare solo righe effettive, non righe aggregate. Quindi, sì, per quanto riguarda l'indice desiderato, la creazione di una tabella con valori univoci come hai menzionato è la tua unica opzione. Applica l'integrità referenziale con un vincolo di chiave esterna da data.day
a days.day
. Questo potrebbe essere anche il migliore per le prestazioni, a seconda della situazione completa.
Tuttavia, poiché si tratta di rendimento , esiste una soluzione alternativa:puoi utilizzare un CTE ricorsivo per emulare una scansione dell'indice allentata:
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;
Parentesi intorno al primo SELECT
sono obbligatori a causa del ORDER BY
allegato e LIMIT
clausole. Vedi:
Questo richiede solo un semplice indice il day
.
Esistono varie varianti, a seconda delle tue effettive query:
- Ottimizza la query GROUP BY per recuperare l'ultima riga per utente
- Query sull'indice non utilizzato nell'intervallo di date
- Seleziona prima riga in ogni gruppo GROUP BY?
Altro nella mia risposta alla tua domanda di follow-up: