Ein Index kann nur tatsächliche Zeilen indizieren, keine aggregierten Zeilen. Ja, was den gewünschten Index betrifft, ist das Erstellen einer Tabelle mit eindeutigen Werten, wie Sie sie erwähnt haben, Ihre einzige Option. Erzwingen Sie die referenzielle Integrität mit einer Fremdschlüsseleinschränkung von data.day
bis days.day
. Das vielleicht auch am besten für die Leistung sein, je nach Gesamtsituation.
Da es hier aber um Leistung geht , gibt es eine alternative Lösung:Sie können einen rekursiven CTE verwenden, um einen losen Index-Scan zu emulieren:
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;
Klammern um das erste SELECT
sind wegen des angehängten ORDER BY
erforderlich und LIMIT
Klauseln. Siehe:
Dies benötigt nur einen einfachen Index am day
.
Abhängig von Ihren konkreten Anfragen gibt es verschiedene Varianten:
- GRUPPE NACH-Abfrage optimieren, um die neueste Zeile pro Benutzer abzurufen
- Unused index in range of date query
- Zuerst auswählen Zeile in jeder GROUP BY-Gruppe?
Mehr dazu in meiner Antwort auf Ihre Folgefrage: