Mengapa Pagination?
Mengembalikan semua data sekaligus boros memori dan lambat. Pagination membagi data menjadi halaman-halaman kecil yang lebih efisien.
1. Offset-based Pagination
Cara paling umum, menggunakan LIMIT dan OFFSET.
-- Halaman 1 (item 1-10)
SELECT * FROM products ORDER BY id LIMIT 10 OFFSET 0;
-- Halaman 2 (item 11-20)
SELECT * FROM products ORDER BY id LIMIT 10 OFFSET 10;
-- Halaman 5 (item 41-50)
SELECT * FROM products ORDER BY id LIMIT 10 OFFSET 40;
Masalah Offset Pagination
- Performa menurun — OFFSET 10000 tetap harus scan 10000 baris dulu
- Data bergeser — jika ada insert/delete saat user pindah halaman, data bisa terlewat atau duplikat
⚠️ Skenario produksi nyata: aplikasi kamu tumbuh dari 10k ke 1 juta produk. Endpoint
/products?page=5000(OFFSET 49990 LIMIT 10) yang tadinya 50ms kini jadi 3 detik. Database tetap harus membaca 49990 baris sebelum membuang-nya — index tidak membantu OFFSET. Solusinya bukan index tambahan, tapi ganti ke cursor-based pagination.
2. Cursor-based Pagination
Menggunakan nilai terakhir sebagai titik referensi, bukan offset.
-- Halaman pertama
SELECT * FROM products ORDER BY id LIMIT 10;
-- Last item id = 10
-- Halaman berikutnya (setelah id 10)
SELECT * FROM products WHERE id > 10 ORDER BY id LIMIT 10;
-- Last item id = 20
-- Halaman berikutnya (setelah id 20)
SELECT * FROM products WHERE id > 20 ORDER BY id LIMIT 10;
Keunggulan Cursor Pagination
- Performa konsisten — tidak peduli halaman ke berapa, selalu cepat
- Stabil — tidak terpengaruh insert/delete data baru
- Cocok untuk — infinite scroll, real-time feeds
Kapan Menggunakan Apa?
- Offset — UI dengan nomor halaman, data statis, dataset kecil
- Cursor — infinite scroll, feeds, dataset besar, real-time data