Bosh sahifa Wiki Offset pagination

Offset pagination

Offset pagination — natijalar to‘plamining ma’lum sondagi dastlabki qatorlarini tashlab, undan keyingi cheklangan qismini qaytarish usuli. SQL da odatda LIMIT va OFFSET, web API da esa page, page_size yoki bevosita offset parametrlari bilan ifodalanadi. Masalan, LIMIT 20 OFFSET 40 tartiblangan natijaning 41–60-qatorlarini oladi.

Sahifa hisoblash

Sahifa raqami birdan boshlansa, offset quyidagicha hisoblanadi:

offset = (page - 1) × page_size

page=3 va page_size=20 uchun offset 40 bo‘ladi. API javobi elementlar bilan birga joriy sahifa, umumiy elementlar soni yoki keyingi sahifa havolasini berishi mumkin. Umumiy sahifalar soni ceil(total / page_size) bilan topiladi, ammo COUNT(*) katta yoki murakkab so‘rovda alohida xarajat tug‘diradi.

Barqaror tartib talabi

Offset faqat aniq ORDER BY bilan ma’noli. Tartib ko‘rsatilmasa, ma’lumotlar bazasi qatorlarni istalgan jismoniy yoki reja tartibida qaytarishi mumkin. Faqat takrorlanuvchi qiymat, masalan created_at, bo‘yicha saralash ham yetarli emas: teng vaqtdagi qatorlar sahifalar orasida joyini almashtirishi mumkin. Shu bois yakunda noyob ustun qo‘shiladi:

ORDER BY created_at DESC, id DESC
LIMIT 20 OFFSET 40;

Bu tartib bir xil snapshot ichida deterministik bo‘ladi. Biroq sahifalar alohida so‘rovlarda olinayotgan paytda yangi qator qo‘shilsa yoki eski qator o‘chirilsa, keyingi offset siljiydi.

O‘zgarayotgan ma’lumotdagi muammo

Foydalanuvchi birinchi sahifani olgach, ro‘yxat boshiga yangi element qo‘shilsa, ikkinchi sahifadagi bir qator avvalgi sahifada ko‘rilgan bo‘lishi mumkin. O‘chirish esa ayrim qatorning tashlab ketilishiga olib keladi. Bu offsetning pozitsiyaga tayanganidan kelib chiqadi; u elementning o‘zini belgilamaydi.

Yangilik lentasi yoki tez o‘zgaradigan hodisalar oqimida cursor/keyset pagination ko‘proq barqaror. Bunda keyingi so‘rov oxirgi ko‘rilgan tartib kalitidan keyingi qatorlarni oladi. Offset esa foydalanuvchi istalgan sahifa raqamiga bevosita o‘tishi kerak bo‘lgan, nisbatan barqaror kataloglarda qulay.

Ishlash samaradorligi

Katta offsetda baza ko‘pincha tashlab yuboriladigan qatorlarni indeks orqali bo‘lsa ham ko‘rib chiqishi kerak. OFFSET 1000000 faqat keyingi 20 qatorni qaytarsa-da, oldingi million pozitsiyani bosib o‘tish xarajatini keltirishi mumkin. Mos kompozit indeks saralashni tezlashtiradi, lekin offset xarajatini to‘liq yo‘q qilmaydi.

API page size uchun maksimal chegara qo‘yadi; aks holda bitta mijoz juda katta javob, xotira va baza yukini hosil qiladi. Parametrlar manfiy yoki haddan tashqari katta bo‘lsa validatsiya qilinadi. Empty page oddiy holat sifatida bo‘sh ro‘yxat bilan qaytarilishi mumkin.

Qo‘llanish sohasi

Admin jadvallari, qidiruv natijalari va kichik kataloglarda offset pagination sodda, tushunarli va sahifa raqamlarini ko‘rsatishga mos. Ma’lumot tez o‘zgarsa, juda katta bo‘lsa yoki uzluksiz scroll talab qilinsa, cursor yondashuvi ko‘rib chiqiladi. Tanlov faqat sintaksisga emas, natijaning vaqt davomida qanday o‘zgarishiga bog‘liq.

Snapshot bilan ishlash

Bir nechta sahifani bitta ma’lumot snapshotida o‘qish siljish muammosini kamaytiradi. Uzoq database tranzaksiyasini foydalanuvchi sahifalari orasida ochiq saqlash amaliy emas: MVCC eski versiyalarni ushlab turadi va resurs sarflaydi. Ayrim API qidiruv snapshoti yoki vaqt belgili token yaratib, keyingi sahifalarni shu muzlatilgan natija doirasida beradi. Tokenning amal qilish muddati va ma’lumot o‘zgarishiga munosabati hujjatlashtiriladi. Snapshot tugagach mijoz yangi qidiruvni birinchi sahifadan boshlaydi.

Bog‘liq tushunchalar

Offset, Limit, Page size, Stable ordering, Cursor pagination, SQL