Indeks może indeksować tylko rzeczywiste wiersze, a nie wiersze zagregowane. Tak więc, jeśli chodzi o pożądany indeks, jedyną opcją jest utworzenie tabeli z unikalnymi wartościami, jak wspomniałeś. Wymuszaj integralność referencyjną za pomocą ograniczenia klucza obcego z data.day
do days.day
. To może być również najlepsze pod względem wydajności, w zależności od całej sytuacji.
Ponieważ jednak chodzi o wydajność , istnieje alternatywne rozwiązanie:możesz użyć rekurencyjnego CTE do emulacji luźnego skanowania indeksu:
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;
Nawiasy wokół pierwszego SELECT
są wymagane ze względu na dołączony ORDER BY
i LIMIT
klauzule. Zobacz:
Wymaga to tylko zwykłego indeksu w day
.
Istnieją różne warianty, w zależności od rzeczywistych zapytań:
- Optymalizuj zapytanie GROUP BY, aby pobrać ostatni wiersz na użytkownika
- Nieużywany indeks w zapytaniu zakresu dat
- Wybierz najpierw wiersz w każdej grupie GROUP BY?
Więcej w mojej odpowiedzi na Twoje dalsze pytanie: