Vim li cas koj thiaj xav tau kev pab txhawb nqa rau pagination ntawm cov yuam sij?

Nyob zoo sawv daws! Kuv yog tus tsim tawm backend sau microservices hauv Java + Spring. Kuv ua haujlwm hauv ib pab pawg tsim khoom tsim khoom sab hauv ntawm Tinkoff.

Vim li cas koj thiaj xav tau kev pab txhawb nqa rau pagination ntawm cov yuam sij?

Hauv peb pab pawg, cov lus nug ntawm kev txhim kho cov lus nug hauv DBMS feem ntau tshwm sim. Koj ib txwm xav ua kom nrawm me ntsis, tab sis koj tsis tuaj yeem tau txais los ntawm kev xav tau tsim cov ntsuas ntsuas - koj yuav tsum nrhiav qee qhov kev daws teeb meem. Thaum ib qho ntawm cov kev taug kev nyob ib ncig ntawm lub vev xaib hauv kev tshawb nrhiav qhov tsim nyog optimizations thaum ua haujlwm nrog databases, kuv pom Marcus Wynand's endlessly helpful blog, tus sau SQL Performance Explained. Qhov no yog hom blog uas tsis tshua muaj uas koj tuaj yeem nyeem tag nrho cov ntawv hauv kab.

Kuv xav txhais ib tsab xov xwm luv luv los ntawm Marcus rau koj. Nws tuaj yeem raug hu mus rau qee qhov kev tshaj tawm uas nrhiav kev mloog rau cov laus, tab sis tseem muaj teeb meem cuam tshuam txog kev ua haujlwm ntawm kev ua haujlwm offset raws li tus qauv SQL.

Hauv qee qhov chaw kuv yuav ntxiv tus sau nrog cov lus piav qhia thiab cov lus pom. Kuv yuav xa mus rau txhua qhov chaw xws li "approx." kom paub meej ntxiv

Me taw qhia

Kuv xav tias muaj coob tus neeg paub yuav ua li cas teeb meem thiab qeeb ua hauj lwm nrog nplooj ntawv xaiv ntawm offset yog. Koj puas paub tias nws tuaj yeem hloov pauv tau yooj yim nrog kev tsim qauv zoo dua?

Yog li, lo lus tseem ceeb offset qhia cov ntaub ntawv kom hla thawj n cov ntaub ntawv hauv qhov kev thov. Txawm li cas los xij, cov ntaub ntawv tseem yuav tsum tau nyeem cov thawj n cov ntaub ntawv los ntawm disk, nyob rau hauv qhov kev txiav txim (ceeb toom: thov kev txheeb xyuas yog tias nws tau teev tseg), thiab tsuas yog tom qab ntawd nws puas tuaj yeem rov qab cov ntaub ntawv los ntawm n + 1 txuas ntxiv mus. Qhov nthuav tshaj plaws yog qhov teeb meem tsis yog nyob rau hauv qhov kev siv tshwj xeeb hauv DBMS, tab sis nyob rau hauv cov ntsiab lus qub raws li tus qauv:

... cov kab yog thawj zaug txheeb raws li thiab tom qab ntawd txwv los ntawm kev xa tus lej ntawm cov kab uas tau teev tseg hauv los ntawm qhov pib…
-SQL:2016, Part 2, 4.15.3 Derived tables (ceeb toom: tam sim no tus qauv siv tshaj plaws)

Lub ntsiab lus tseem ceeb ntawm no yog qhov offset siv ib qho kev txwv - tus naj npawb ntawm cov ntaub ntawv hla, thiab qhov ntawd yog nws. Ua raws li cov ntsiab lus no, DBMS tsuas tuaj yeem khaws tag nrho cov ntaub ntawv thiab muab pov tseg cov tsis tsim nyog. Obviously, qhov kev txhais ntawm offset yuam peb ua hauj lwm ntxiv. Thiab nws tsis muaj teeb meem txawm tias nws yog SQL lossis NoSQL.

Tsuas yog mob me ntsis ntxiv

Cov teeb meem nrog offset tsis xaus rau ntawd, thiab ntawm no yog vim li cas. Yog tias, ntawm kev nyeem ob nplooj ntawv ntawm cov ntaub ntawv los ntawm disk, lwm txoj haujlwm ntxig rau cov ntaub ntawv tshiab, yuav ua li cas rau qhov no?

Vim li cas koj thiaj xav tau kev pab txhawb nqa rau pagination ntawm cov yuam sij?

Thaum offset yog siv los hla cov ntaub ntawv los ntawm cov nplooj ntawv dhau los, nyob rau hauv qhov xwm txheej ntawm kev ntxiv cov ntaub ntawv tshiab ntawm kev nyeem cov nplooj ntawv sib txawv, koj yuav tau txais duplicates (ceeb toom: qhov no ua tau thaum peb nyeem nplooj ntawv los ntawm nplooj ntawv siv qhov kev txiav txim los ntawm kev tsim, ces nyob rau hauv nruab nrab ntawm peb cov zis nws yuav tau txais ib tug tshiab nkag).

Daim duab qhia meej meej txog qhov xwm txheej no. Lub hauv paus nyeem thawj 10 cov ntaub ntawv, tom qab ntawd cov ntaub ntawv tshiab tau muab tso rau, uas offsets tag nrho cov ntaub ntawv nyeem los ntawm 1. Ces lub hauv paus siv nplooj ntawv tshiab los ntawm 10 cov ntaub ntawv tom ntej thiab pib tsis yog los ntawm 11th, raws li nws yuav tsum, tab sis los ntawm cov ntaub ntawv tshiab. 10th, duplicating cov ntaub ntawv no. Muaj lwm yam kev tsis txaus ntseeg cuam tshuam nrog kev siv cov lus qhia no, tab sis qhov no yog qhov ntau tshaj.

Raws li peb tau pom lawm, cov no tsis yog teeb meem ntawm DBMS tshwj xeeb lossis lawv cov kev siv. Qhov teeb meem yog nyob rau hauv kev txhais pagination raws li tus qauv SQL. Peb qhia rau DBMS nplooj ntawv twg mus nqa lossis muaj pes tsawg cov ntaub ntawv hla. Lub database tsuas yog tsis tuaj yeem ua kom zoo dua li qhov kev thov, vim tias muaj cov ntaub ntawv tsawg dhau rau qhov no.

Nws tseem tsim nyog qhia meej tias qhov no tsis yog teeb meem nrog cov lus tseem ceeb, tab sis nrog rau cov lus nug ntawm cov lus nug. Muaj ntau ntau syntaxes uas zoo ib yam nyob rau hauv lawv qhov teeb meem:

  • Lub ntsiab lus offset yog raws li tau hais ua ntej.
  • Kev tsim kho ntawm ob lub ntsiab lus txwv [offset] (txawm tias txwv nws tus kheej tsis yog qhov phem).
  • Lim los ntawm cov ciam teb qis, raws li kab zauv (piv txwv li, row_number(), rownum, thiab lwm yam).

Tag nrho cov kab lus no tsuas yog qhia koj tias muaj pes tsawg kab hla, tsis muaj cov ntaub ntawv ntxiv lossis cov ntsiab lus.

Tom qab hauv tsab xov xwm no, lo lus tseem ceeb offset yog siv los ua cov ntsiab lus ntawm tag nrho cov kev xaiv no.

Lub neej tsis muaj OFFSET

Tam sim no cia peb xav txog seb peb lub ntiaj teb yuav zoo li cas yam tsis muaj tag nrho cov teeb meem no. Nws hloov tawm hais tias lub neej yam tsis muaj offset tsis yog li ntawd nyuaj: nrog ib tug xaiv, koj muaj peev xwm xaiv tsuas yog cov kab uas peb tseem tsis tau pom (ceeb toom: uas yog, cov uas tsis nyob rau nplooj ntawv dhau los), siv ib tug mob nyob rau hauv qhov twg.

Nyob rau hauv cov ntaub ntawv no, peb pib los ntawm qhov tseeb hais tias kev xaiv raug tua ntawm ib qho kev txiav txim (zoo qub kev txiav txim los ntawm). Txij li thaum peb muaj ib qho kev txiav txim, peb tuaj yeem siv cov lim dej yooj yim kom tau txais cov ntaub ntawv tsuas yog tom qab cov ntaub ntawv kawg ntawm nplooj ntawv dhau los:

    SELECT ...
    FROM ...
    WHERE ...
    AND id < ?last_seen_id
    ORDER BY id DESC
    FETCH FIRST 10 ROWS ONLY

Qhov ntawd yog tag nrho lub hauv paus ntsiab lus ntawm txoj kev no. Tau kawg, txhua yam tau lom zem dua thaum txheeb los ntawm ntau kab, tab sis lub tswv yim tseem zoo li qub. Nws yog ib qho tseem ceeb kom nco ntsoov tias qhov kev tsim no siv tau rau ntau tus NoSQL- kev txiav txim siab.

Txoj kev no hu ua nrhiav txoj kev los yog keyset pagination. Nws daws qhov teeb meem ntawm qhov tshwm sim floating (ceeb toom: qhov xwm txheej nrog kev sau ntawv ntawm nplooj ntawv nyeem tau piav qhia ua ntej) thiab, tau kawg, qhov peb txhua tus nyiam, nws ua haujlwm sai dua thiab ruaj khov dua li cov classic offset. Kev ruaj ntseg nyob rau hauv qhov tseeb hais tias lub sij hawm thov ua tsis tau nce nyob rau hauv feem ntau ntawm lub rooj thov (ceeb toom: Yog hais tias koj xav paub ntau ntxiv txog kev ua hauj lwm ntawm ntau txoj kev mus rau pagination, koj yuav tau saib los ntawm tus sau qhov kev nthuav qhia. Koj tseem tuaj yeem pom cov qauv piv txwv rau ntau txoj hauv kev muaj).

Ib tug swb tham txog qhov ntawdtias pagination los ntawm cov yuam sij, ntawm chav kawm, tsis yog txhua yam - nws muaj nws cov kev txwv. Qhov tseem ceeb tshaj plaws yog tias nws tsis muaj peev xwm nyeem cov nplooj ntawv random (ceeb toom: inconsistently). Txawm li cas los xij, nyob rau hauv lub caij nyoog ntawm qhov kawg scrolling (ceeb toom: nyob rau hauv pem hauv ntej kawg), qhov no tsis yog ib qho teeb meem. Kev qhia tus lej nplooj ntawv rau kev nyem yog qhov kev txiav txim siab phem hauv UI tsim ib qho twg (ceeb toom: kev xav ntawm tus sau tsab xov xwm).

Yuav ua li cas txog cov cuab yeej?

Pagination ntawm cov yuam sij feem ntau tsis haum vim tsis muaj kev txhawb nqa rau txoj kev no. Cov cuab yeej tsim kho feem ntau, suav nrog ntau lub hauv paus, tsis tso cai rau koj xaiv raws nraim li cas pagination yuav ua tiav.

Qhov xwm txheej yog qhov hnyav dua los ntawm qhov tseeb tias txoj kev piav qhia yuav tsum muaj kev txhawb nqa kawg-rau-kawg hauv cov thev naus laus zis siv - los ntawm DBMS mus rau kev ua tiav ntawm AJAX thov hauv qhov browser nrog qhov kawg scrolling. Hloov chaw tsuas yog qhia tus lej nplooj ntawv xwb, tam sim no koj yuav tsum qhia cov yuam sij rau txhua nplooj ntawv ib zaug.

Txawm li cas los xij, tus naj npawb ntawm cov txheej txheem uas txhawb nqa pagination ntawm cov yuam sij yog maj mam loj hlob. Nov yog yam peb muaj nyob rau tam sim no:

(Ceeb toom: qee qhov txuas tau raug tshem tawm vim tias thaum lub sijhawm txhais lus qee lub tsev qiv ntawv tsis tau hloov kho txij li xyoo 2017-2018. Yog tias koj txaus siab, koj tuaj yeem saib ntawm qhov qub.)

Nws yog lub sijhawm no uas koj xav tau kev pab. Yog tias koj tsim lossis txhawb nqa lub moj khaum uas ua rau muaj kev siv pagination, ces kuv thov, Kuv thov, Kuv thov kom koj muab kev txhawb nqa ib txwm rau pagination ntawm cov yuam sij. Yog tias koj muaj lus nug lossis xav tau kev pab, kuv yuav zoo siab pab (kev sab laj, Twitter, hu rau daim ntawv) (ceeb toom: los ntawm kuv qhov kev paub nrog Marcus, kuv tuaj yeem hais tias nws zoo siab heev txog kev nthuav tawm cov ncauj lus no).

Yog tias koj siv cov kev daws teeb meem uas koj xav tias tsim nyog muaj kev txhawb nqa rau pagination los ntawm cov yuam sij, tsim ib qho kev thov lossis txawm tias muaj kev npaj ua tiav, yog tias ua tau. Koj tseem tuaj yeem txuas rau kab lus no.

xaus

Yog vim li cas vim li cas thiaj li yooj yim thiab muaj txiaj ntsig zoo li pagination los ntawm cov yuam sij tsis dav tsis yog tias nws nyuaj rau kev siv thev naus laus zis lossis xav tau kev siv zog ntau. Qhov laj thawj tseem ceeb yog tias ntau tus neeg tau txais kev pom thiab ua haujlwm nrog offset - qhov kev qhia no tau hais los ntawm tus qauv nws tus kheej.

Raws li qhov tshwm sim, ob peb tus neeg xav txog kev hloov mus rau qhov kev ua pagination, thiab vim li no, kev txhawb nqa los ntawm lub moj khaum thiab cov tsev qiv ntawv tab tom txhim kho tsis zoo. Yog li ntawd, yog tias lub tswv yim thiab lub hom phiaj ntawm offset-free pagination nyob ze koj, pab nthuav nws!

Tau qhov twg los: https://use-the-index-luke.com/no-offset
Sau: Markus Winand

Tau qhov twg los: www.hab.com

Ntxiv ib saib