Indeks hanya dapat mengindeks baris aktual, bukan baris gabungan. Jadi, ya, sejauh indeks yang diinginkan berjalan, membuat tabel dengan nilai unik seperti yang Anda sebutkan adalah satu-satunya pilihan Anda. Terapkan integritas referensial dengan batasan kunci asing dari data.day
ke days.day
. Ini mungkin juga menjadi yang terbaik untuk kinerja, tergantung pada situasi lengkapnya.
Namun, karena ini tentang kinerja , ada solusi alternatif:Anda dapat menggunakan CTE rekursif untuk meniru pemindaian indeks longgar:
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;
Tanda kurung di sekitar SELECT
first pertama diperlukan karena ORDER BY
yang terlampir dan LIMIT
klausa. Lihat:
Ini hanya membutuhkan indeks biasa pada day
.
Ada berbagai varian, tergantung pada kueri Anda yang sebenarnya:
- Optimalkan kueri GROUP BY untuk mengambil baris terbaru per pengguna
- Indeks yang tidak digunakan dalam kueri rentang tanggal
- Pilih dulu baris di setiap grup GROUP BY?
Selengkapnya dalam jawaban saya untuk pertanyaan tindak lanjut Anda: