API Sayfalaması: Offset-Limit vs Cursor İmleci Nasıl Çalışır?
# API Sayfalaması: Offset-Limit vs Cursor İmleci
Bir API'den 1 milyon kaydı bir kerede çekemezsin. Veritabanı çöker, ağ bağlantısı kopabilir. Bu yüzden verileri parçalara bölerek göndeririz. Ama nasıl böleceğiz? İki yöntem var.
En basit yöntemdir. "Baştan 20. kaydından sonra 10 kayıt ver" anlamına gelir.
Nasıl çalışır:
- `offset=20` 20. kaydı atla
- `limit=10` sonra 10 kayıt getir
1GET /api/users?offset=0&limit=102// Çıktı: 1-10. kullanıcılar34GET /api/users?offset=10&limit=105// Çıktı: 11-20. kullanıcılar67GET /api/users?offset=20&limit=108// Çıktı: 21-30. kullanıcılarAvantajı: Anlaşılması kolay, herhangi bir sayfaya direkt gidebilirsin.
Sorunu: Veritabanı her seferinde baştan 20 kaydı sayıyor, sonra atıyor. Veri çoksa çok yavaş olur.
Bir işaretçi (cursor) kullanarak "son gördüğün yerden devam et" dersin.
Nasıl çalışır:
- İlk istek: cursor yok, ilk 10 kayıt gelir
- Cevap: son kaydın ID'sini next_cursor olarak döner
- İkinci istek: next_cursor değerini gönderirsin
1GET /api/users?limit=102// Çıktı:3{4"data": [{"id": 1, "name": "Ali"},...],5"next_cursor": "eyJpZCI6IDEwfQ==" // Base64 encoded6}78GET /api/users?limit=10&cursor=eyJpZCI6IDEwfQ=="9// Çıktı:10{11"data": [{"id": 11, "name": "Veli"},...],12"next_cursor": "eyJpZCI6IDIwfQ=="13}Avantajı: Veritabanı sadece son konumdan devam eder. Çok hızlı ve ölçeklenebilir.
Sorunu: Direkt 100. sayfaya gidemezsin. Sırayla gitmek zorundasın.
- Offset-limit: Küçük veri (1000 kayıt), sayfalama gösterimi (1, 2, 3... sayfalar) gerekiyorsa.
- Cursor: Büyük veri, sonsuz kaydırma (infinite scroll), gerçek zamanlı akış için.
Modern uygulamalar (Twitter, Instagram) cursor kullanır. Eski web siteleri offset-limit kullanır.
4 yorum
cursor da silme problemi var ama offset limitten farklı şekilde.
cursor kullanırken de bir sorun var ya mesela veri siliniyor arası dönemde ne oluyor offset limitten farklı mı
cursor daha mantıklı geliyor çünkü veritabanı sürekli baştan sayıp durmuyor, bir yerden devam ediyor.
offset-limit basit ama veri çoksa gerçekten ölür, her seferinde baştan sayması çok saçma.