title: 40 Resolver Pagination yang Efisien untuk Data Besar
date: 2024-06-12
tags: [pagination, backend, graphQL, REST, performance, scalable-architecture]
Pagination adalah salah satu tantangan klasik ketika kita harus menampilkan data besar dengan performa optimal. Semakin banyak aplikasi yang scale-up, pagination tidak lagi sekadar membagi-bagi data per halaman, namun juga menjaga performa layanan backend, pengalaman pengguna, dan penggunaan resource server. Dalam artikel ini, saya akan membedah berbagai strategi resolver pagination, terutama dalam konteks GraphQL maupun REST API, serta memberikan 40 tips dan teknik efisien dalam menangani data besar. Kita akan bahas best practice, dengan contoh kode Python (Django), Node.js (Express) serta studi kasus langsung dari industri.
Permasalahan Umum: Pagination pada Data Berskala Besar
Di era digital, aplikasi modern—entah itu e-commerce, media sosial, maupun SaaS—pasti bergelut dengan jutaan record di database. Penggunaan teknik pagination yang salah dapat menyebabkan:
- Query lambat
- Beban database tinggi
- Latency pada API
- Pengalaman pengguna menurun
Kita akan bedah solusi modern untuk masalah klasik ini.
Jenis Pagination
Sebelum masuk ke 40 tips, sangat penting untuk memahami tiga pola utama pagination:
Jenis | Keunggulan | Kekurangan | Cocok Untuk |
---|---|---|---|
Offset | Paling umum dan sederhana | Semakin lambat pada data besar | Data kecil-menengah |
Cursor/Key | Efisien dan scalable | Implementasi kadang tricky | Data sangat besar |
Seek | Super cepat, real-time-ish | Terbatas pada satu kolom pengurutan | Streaming, Big Data |
Kita akan fokus pada pagination yang efisien, terutama Cursor dan Seek.
Arsitektur: Bagaimana Resolver Pagination Bekerja
Sebelum membahas teknik, mari lihat alur kerja resolver pagination, baik pada GraphQL maupun REST.
flowchart TD Client -->|Request: page/cursor| API API --> Resolver Resolver -->|Query with params| Database Database -->|Results| Resolver Resolver -->|Data+Meta Info| API API -->|Response JSON| Client
Pada skema di atas, Resolver adalah otak dari operasi pagination—tempat filter, urutkan, dan generate metadata (hasNextPage
, total
, dsb).
40 Tips dan Teknik Efisien Resolver Pagination pada Data Besar
1-10: Desain Dasar yang Solid
Gunakan Cursor-based Pagination untuk Data > 10K
Hindari offset. Cursor lebih konsisten (apalagi terjadi insert/hapus).Indexing Field Pagination
Pastikan kolom yang dijadikan cursor sudah terindex di database.Query Selective Field
Pilih hanya field yang diperlukan; jangan SELECT *.Limit Query Result
Batasi data yang dikirim per halaman, misal 50–100 row maximum.Kalkulasi Total Tidak Di Query Utama
Pisahkan query data dan total count; eksekusi async bila memungkinkan.Gunakan UUID Sebagai Cursor
Hindari nomor increment, gunakan UUID untuk keamanan dan unik.Optimize Sort Order
Query selalu diberi ORDER BY explicit, sesuai cursor.Return PageInfo Metadata
Tambahkan info next/previous, boolean hasNext, dsb.Hindari Pagination untuk Data Statis
Return seluruh data jika <100 record.Caching Pagination Query
Cache result halaman populer.
11-20: Teknik Query di Berbagai Platform
- Gunakan Query JSONB Index pada PostgreSQL
- Implementasi Limit-Offset di Redis untuk List Sederhana
- Range Scan di MongoDB menggunakan Indeks Field
- Elasticsearch Search After—pakai sort key sebagai cursor
- Sharding Pagination untuk cluster database horizontal
- Hindari DISTINCT jika Tidak Perlu dalam query
- Query Async (Promise.all) untuk Metadata di Node.js
- Gunakan EXPLAIN pada query pagination untuk troubleshooting
- Preload Association secara Selective (GraphQL resolver)
- Query Paging pada Aggregate Table
21-30: Simulasi Kode dan Studi Kasus Nyata
Offset (tidak efisien untuk >10K data)
// Node.js Express - Tidak disarankan untuk data besar
app.get('/users', async (req, res) => {
const { page = 1, limit = 20 } = req.query;
const offset = (page - 1) * limit;
const users = await User.find().skip(offset).limit(limit);
res.json(users);
});
Cursor (Sangat Efisien)
# Django/Python GraphQL
def resolve_users(parent, info, after=None, first=20):
query = User.objects.all().order_by('created_at')
if after:
query = query.filter(created_at__gt=after)
items = list(query[:first])
end_cursor = items[-1].created_at if items else None
return {
"edges": items,
"pageInfo": {
"endCursor": end_cursor,
"hasNextPage": len(items) == first
}
}
- Efektif pada tabel besar, hanya load data “semenjak” posisi cursor.
Seek Method (Streaming/Big Data)
-- MySQL seek, hanya bekerja untuk sorted field primary key
SELECT * FROM log_table
WHERE id > LAST_SEEN_ID
ORDER BY id
LIMIT 100;
31-40: Production Tips dan Edge Cases
Implementasikan Rate Limit pada Pagination API
Supaya klien tidak scraping semua data sekaligus.Paginate Secara Konsisten pada Join Table
Gunakan cursor composite bila data berasal dari gabungan tabel.Putar Cursor Secara Ter-enkripsi
Untuk keamanan hilangkan bocoran data dari clients.Lazy Loading di Frontend
Kombinasikan dengan infinite scroll.Resumable Pagination
Simpan posisi cursor jika user reconnect.Paginate Bersama Filter dan Search
Filter data dulu, baru apply cursor.Testing Load Pagination
Simulasikan query concurrency tinggi.Error Handling pada Cursor Expired
Tangkap kasus data sudah terhapus.Pagination dan Sorting Multi-field
Cursor bisa dalam bentuk pasangan:(created_at, id)
Monitoring Slow Query untuk Endpoint Pagination
Tools: APM, logs untuk query slow pada endpoint ini.
Contoh Simulasi: Data 5 Juta Row
Misal kita punya tabel transactions
dengan 5 juta data. Kita bandingkan performance offset vs cursor.
Pagination | Fetch Halaman 100 | Total Time |
---|---|---|
Offset | 5 Juta Scan | 3.4s |
Cursor | 2 Query Index | 24ms |
Hasilnya, cursor-based jauh lebih efisien di database relasi maupun NoSQL.
Kesimpulan
Pagination tampak sederhana—namun kebutuhan aplikasi modern mengharuskan kita efisien dan scalable. Dengan mengadopsi 40 tips di atas, kamu akan jauh lebih siap menangani data besar tanpa kompromi performa API.
Jika kamu sedang membangun resolver untuk GraphQL/REST, gunakan kombinasi cursor-based dan trik optimasi query agar user experience tetap maksimal. Selalu monitor dan uji performance, karena “semakin besar data, semakin besar pula tantangannya!”.
Semoga bermanfaat—jangan ragu share teknik pagination favoritmu di kolom komentar! 🚀
62. gRPC Reflection untuk Tools seperti `grpcurl`
63. gRPC Health Checking Standar
Artikel Terhangat
41 Pengenalan Unit Test untuk Resolver
08 Aug 2025
63. gRPC Health Checking Standar
08 Aug 2025
39 Skema Filter & Pagination: Best Practice
08 Aug 2025
61. Load Balancing di gRPC Client
08 Aug 2025

41 Pengenalan Unit Test untuk Resolver

63. gRPC Health Checking Standar

39 Skema Filter & Pagination: Best Practice
