Dengan asumsi kita berhadapan dengan meja besar , sebuah indeks parsial mungkin membantu:
CREATE INDEX tbl_created_recently_idx ON tbl (created_at DESC)
WHERE created_at > '2013-09-15 0:0'::timestamp;
Seperti yang sudah Anda ketahui:turun atau naik hampir tidak penting di sini. Postgres dapat memindai mundur dengan kecepatan yang hampir sama (pengecualian berlaku dengan indeks multi-kolom).
Permintaan untuk menggunakan indeks ini:
SELECT * FROM tbl
WHERE created_at > '2013-09-15 0:0'::timestamp -- matches index
ORDER BY created_at DESC
LIMIT 1;
Intinya di sini adalah untuk membuat indeks jauh lebih kecil , jadi akan lebih mudah untuk menyimpan dan memeliharanya.
- Anda harus memilih stempel waktu yang dijamin lebih kecil dari yang terbaru.
- Anda harus membuat ulang indeks dari waktu ke waktu untuk memotong data lama.
- Kondisi harus
IMMUTABLE
.
Jadi efek satu kali memburuk dari waktu ke waktu. Masalah khusus adalah kondisi kode keras:
WHERE created_at > '2013-09-15 0:0'::timestamp
Otomatiskan
Anda dapat memperbarui indeks dan kueri Anda secara manual dari waktu ke waktu. Atau Anda mengotomatiskannya dengan bantuan fungsi seperti ini:
CREATE OR REPLACE FUNCTION f_min_ts()
RETURNS timestamp LANGUAGE sql IMMUTABLE AS
$$SELECT '2013-09-15 0:0'::timestamp$$
Indeks:
CREATE INDEX tbl_created_recently_idx ON tbl (created_at DESC);
WHERE created_at > f_min_ts();
Pertanyaan:
SELECT * FROM tbl
WHERE created_at > f_min_ts()
ORDER BY created_at DESC
LIMIT 1;
Otomatiskan rekreasi dengan tugas cron atau beberapa peristiwa berbasis pemicu. Pertanyaan Anda bisa tetap sama sekarang. Namun Anda perlu membuat ulang semua indeks menggunakan fungsi ini dengan cara apa pun setelah mengubahnya. Cukup letakkan dan buat masing-masing.
Pertama ..
... uji apakah Anda benar-benar berhasil dengan ini.
Coba apakah indeks DROP index ... ; CREATE index ...
melakukan pekerjaan. Maka indeks Anda mungkin membengkak. Pengaturan vakum otomatis Anda mungkin tidak aktif.
Atau coba VACUUM FULL ANALYZE
untuk mendapatkan seluruh tabel plus indeks Anda dalam kondisi bersih dan periksa lagi.
Opsi lain sertakan penyetelan kinerja umum dan indeks penutup, tergantung pada apa yang sebenarnya Anda ambil dari tabel.