Bosh sahifa Wiki Offset

Offset

Offset — ketma-ketlik yoki natijalar to‘plamining boshidan nechta birlik tashlab o‘tilishini bildiruvchi son. Ma’lumotlar bazasi paginationida OFFSET 40 tartiblangan natijaning dastlabki qirq qatorini o‘tkazib yuboradi. Atama xabar jurnallari va fayl tizimida ham uchraydi, lekin u yerda ma’nosi qatorlar sonidan ko‘ra pozitsiya yoki bayt manzili bo‘lishi mumkin.

SQL paginationidagi offset

SQL so‘rovida offset limit bilan birga qo‘llanadi:

SELECT id, name
FROM products
ORDER BY name ASC, id ASC
LIMIT 20 OFFSET 40;

Bu so‘rov uchinchi yigirmatalik oynani qaytaradi. Offset nol bo‘lsa, hech bir qator tashlanmaydi. Manfiy qiymat odatda yaroqsiz. API parametrini SQL ga uzatishdan oldin butun son, minimal va maksimal chegaralar bo‘yicha validatsiya qilish kerak; parametr bind qilish injection xavfini kamaytiradi.

Offset qator identifikatori emas. Qator qo‘shilishi yoki o‘chirilishi bilan keyingi pozitsiyalar siljiydi. Birinchi sahifadan so‘ng ro‘yxat boshiga yangi yozuv kelsa, oldin ko‘rilgan oxirgi yozuv ikkinchi sahifada yana chiqishi mumkin. Shu sababli tez o‘zgaradigan lentada cursor ko‘proq barqaror.

Katta qiymat xarajati

Ma’lumotlar bazasi qaytarmaydigan dastlabki qatorlarni ham topib, sanab yoki indeks bo‘ylab bosib o‘tishi mumkin. Offset oshgani sari so‘rov vaqti ko‘pincha ortadi. Saralashga mos indeks diskdagi to‘liq sortni kamaytiradi, lekin millionta indeks yozuvini tashlab o‘tish baribir ish talab qiladi.

Keyset pagination oxirgi ko‘rilgan qiymatdan foydalanadi:

WHERE (created_at, id) < (:last_created_at, :last_id)
ORDER BY created_at DESC, id DESC
LIMIT 20

Bu usul indeksda kerakli chegaradan boshlashi mumkin, ammo “357-sahifaga sakrash” kabi bevosita page navigatsiyasini bermaydi.

Xabar oqimidagi offset

Append-only log va stream platformalarida offset partition ichidagi yozuv pozitsiyasidir. Consumer qaysi yozuvgacha o‘qiganini offset bilan qayd etadi. Bu SQL offsetidan farq qiladi: broker offseti odatda muayyan recordning barqaror joyi, OFFSET N esa joriy so‘rov natijasidan N qator tashlash buyrug‘i.

Consumer offsetni qayta ishlashdan oldin commit qilsa, crash paytida xabar yo‘qolgan deb ko‘rinishi mumkin. Keyin commit qilsa, qayta ishga tushganda xabar takror ishlanadi. Exactly-once yoki idempotent consumer offset va domen natijasini muvofiqlashtiradi.

Fayl va xotiradagi offset

Fayl offseti boshidan baytlar soni bilan pozitsiyani bildiradi. Random access o‘qish ma’lum offsetdan boshlanadi. Strukturali faylda bayt offsetini belgilar soni bilan tenglashtirish xato: UTF-8 belgisi bir necha bayt bo‘lishi mumkin. Xotirada offset obyekt yoki segment boshiga nisbatan manzil farqini anglatadi.

Shuning uchun “offset” ishlatilgan API uning birligi, boshlanish nuqtasi, nolga asoslanganligi va o‘zgarishlarga chidamliligini hujjatlashtirishi kerak.

Indeks va tanlov rejalari

Saralash ustunlariga mos B-tree indeks bo‘lsa, baza qatorlarni tayyor tartibda o‘qishi mumkin. Covering index so‘rovdagi barcha maydonni indeksdan berib, jadvalga murojaatni kamaytiradi. Biroq katta offsetda har bir tashlangan indeks yozuvi baribir ko‘riladi. Query planner kichik va katta offset uchun boshqa reja tanlashi mumkin, shu sababli faqat birinchi sahifaning execution planini tekshirish yetarli emas.

Offset qiymati foydalanuvchidan kelsa, juda katta sonlar resurs sarfini oshiruvchi so‘rovga aylanishi mumkin. API maksimal page chuqurligini cheklashi yoki ma’lum chegaradan keyin cursor talab qilishi mumkin. Bu limit natijalar sonidan alohida himoya hisoblanadi.

Bog‘liq tushunchalar

Limit, Offset pagination, Consumer offset, Cursor pagination, Partition, File position