Kini idi ti o nilo atilẹyin ohun elo fun pagination lori awọn bọtini?

Bawo ni gbogbo eniyan! Mo jẹ olupilẹṣẹ afẹyinti ti nkọwe awọn iṣẹ microservices ni Java + Orisun omi. Mo ṣiṣẹ ni ọkan ninu awọn ẹgbẹ idagbasoke ọja inu ni Tinkoff.

Kini idi ti o nilo atilẹyin ohun elo fun pagination lori awọn bọtini?

Ninu ẹgbẹ wa, ibeere ti iṣapeye awọn ibeere ni DBMS nigbagbogbo dide. O nigbagbogbo fẹ lati ni iyara diẹ, ṣugbọn o ko le gba nigbagbogbo pẹlu awọn atọka ti a ṣe ironu — o ni lati wa diẹ ninu awọn agbegbe iṣẹ. Lakoko ọkan ninu awọn lilọ kiri wọnyi ni ayika wẹẹbu ni wiwa awọn iṣapeye ti o tọ nigbati o n ṣiṣẹ pẹlu awọn apoti isura data, Mo rii Bulọọgi iranlọwọ ailopin ti Marcus Wynand, onkowe ti SQL Performance Salaye. Eyi ni iru bulọọgi ti o ṣọwọn ninu eyiti o le ka gbogbo awọn nkan ni ọna kan.

Emi yoo fẹ lati tumọ ọrọ kukuru kan nipasẹ Marcus fun ọ. O le pe ni diẹ ninu awọn ifihan ti o n wa lati fa ifojusi si atijọ, ṣugbọn iṣoro ti o yẹ ti iṣẹ ti iṣẹ aiṣedeede ni ibamu si boṣewa SQL.

Ni awọn aaye kan Emi yoo ṣafikun onkọwe pẹlu awọn alaye ati awọn asọye. Emi yoo tọka si gbogbo iru awọn aaye bii “isunmọ.” fun diẹ wípé

Ifihan kekere kan

Mo ro pe ọpọlọpọ awọn eniyan mọ bi iṣoro ati o lọra ṣiṣẹ pẹlu awọn yiyan oju-iwe nipasẹ aiṣedeede jẹ. Njẹ o mọ pe o le ni irọrun rọpo pẹlu apẹrẹ ti o munadoko diẹ sii?

Nitorinaa, Koko aiṣedeede sọ fun data data lati foju awọn igbasilẹ n akọkọ ninu ibeere naa. Sibẹsibẹ, ibi ipamọ data tun nilo lati ka awọn igbasilẹ n akọkọ wọnyi lati disk, ni aṣẹ ti a fun (akọsilẹ: lo yiyan ti o ba jẹ pato), ati pe lẹhinna nikan ni yoo ṣee ṣe lati da awọn igbasilẹ pada lati n + 1 siwaju. Ohun ti o nifẹ julọ ni pe iṣoro naa kii ṣe ni imuse kan pato ninu DBMS, ṣugbọn ni itumọ atilẹba ni ibamu si boṣewa:

…awọn ori ila ni a kọkọ to lẹsẹsẹ ni ibamu si ati lẹhinna ni opin nipasẹ sisọ nọmba awọn ori ila ti a sọ pato ninu lati ibẹrẹ…
-SQL: 2016, Apá 2, 4.15.3 Awọn tabili ti a gba (akọsilẹ: lọwọlọwọ boṣewa ti a lo julọ)

Koko bọtini nibi ni pe aiṣedeede gba paramita kan - nọmba awọn igbasilẹ lati fo, ati pe iyẹn ni. Ni atẹle itumọ yii, DBMS le gba gbogbo awọn igbasilẹ pada nikan lẹhinna sọ awọn ti ko wulo. O han ni, itumọ aiṣedeede yii fi agbara mu wa lati ṣe iṣẹ afikun. Ati pe ko ṣe pataki boya SQL tabi NoSQL.

O kan diẹ diẹ irora

Awọn iṣoro pẹlu aiṣedeede ko pari sibẹ, ati idi niyi. Ti, laarin kika awọn oju-iwe meji ti data lati disk, iṣiṣẹ miiran fi igbasilẹ tuntun sii, kini yoo ṣẹlẹ ninu ọran yii?

Kini idi ti o nilo atilẹyin ohun elo fun pagination lori awọn bọtini?

Nigbati a ba lo aiṣedeede lati foju awọn igbasilẹ lati awọn oju-iwe ti tẹlẹ, ni ipo ti fifi igbasilẹ tuntun kun laarin awọn kika ti awọn oju-iwe oriṣiriṣi, o ṣee ṣe julọ lati gba awọn ẹda-iwe (akọsilẹ: eyi ṣee ṣe nigbati a ba ka oju-iwe nipasẹ oju-iwe nipa lilo aṣẹ nipasẹ kikọ, lẹhinna ni arin iṣẹjade wa o le gba titẹsi tuntun).

Nọmba naa ṣe afihan ipo yii ni kedere. Ipilẹ naa ka awọn igbasilẹ 10 akọkọ, lẹhin eyi ti a fi igbasilẹ titun sii, eyi ti o ṣe atunṣe gbogbo awọn igbasilẹ kika nipasẹ 1. Lẹhinna ipilẹ naa gba oju-iwe tuntun lati awọn igbasilẹ 10 ti o tẹle ati bẹrẹ kii ṣe lati 11th, bi o ti yẹ, ṣugbọn lati inu 10th, pidánpidán igbasilẹ yii. Awọn aiṣedeede miiran wa ti o ni nkan ṣe pẹlu lilo ikosile yii, ṣugbọn eyi ni o wọpọ julọ.

Gẹgẹbi a ti rii tẹlẹ, iwọnyi kii ṣe awọn iṣoro ti DBMS kan pato tabi awọn imuse wọn. Iṣoro naa wa ni asọye pagination ni ibamu si boṣewa SQL. A sọ fun DBMS iru oju-iwe wo lati mu tabi iye awọn igbasilẹ lati fo. Ibi ipamọ data nìkan ko ni anfani lati mu iru ibeere bẹẹ wa, nitori alaye diẹ wa fun eyi.

O tun tọ lati ṣalaye pe eyi kii ṣe iṣoro pẹlu koko-ọrọ kan pato, ṣugbọn dipo pẹlu awọn atunmọ ti ibeere naa. Ọpọlọpọ awọn sintasi diẹ sii ti o jẹ aami kanna ni iseda iṣoro wọn:

  • Koko aiṣedeede jẹ bi a ti sọ tẹlẹ.
  • A ikole ti meji Koko iye to [aiṣedeede] (biotilejepe iye to ara ni ko ki buburu).
  • Sisẹ nipasẹ awọn opin isalẹ, da lori nọmba ila (fun apẹẹrẹ, row_number(), rownum, ati bẹbẹ lọ).

Gbogbo awọn ikosile wọnyi sọ fun ọ iye awọn ila lati fo, ko si alaye afikun tabi ọrọ-ọrọ.

Nigbamii ninu nkan yii, Koko aiṣedeede ni a lo bi akojọpọ gbogbo awọn aṣayan wọnyi.

Aye laisi OFFSET

Bayi jẹ ki a fojuinu kini agbaye wa yoo dabi laisi gbogbo awọn iṣoro wọnyi. O wa ni pe igbesi aye laisi aiṣedeede ko nira pupọ: pẹlu yiyan, o le yan awọn ori ila nikan ti a ko tii rii (akọsilẹ: iyẹn ni, awọn ti ko si ni oju-iwe ti tẹlẹ), ni lilo ipo ni ibiti.

Ni idi eyi, a bẹrẹ lati otitọ pe awọn aṣayan ti wa ni pipa lori eto ti a paṣẹ (ibere atijọ nipasẹ). Niwọn bi a ti ni eto ti o paṣẹ, a le lo àlẹmọ ti o rọrun lati gba data nikan ti o wa lẹhin igbasilẹ ti o kẹhin ti oju-iwe iṣaaju:

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

Iyẹn ni gbogbo ilana ti ọna yii. Nitoribẹẹ, awọn nkan gba igbadun diẹ sii nigbati yiyan nipasẹ ọpọlọpọ awọn ọwọn, ṣugbọn imọran tun jẹ kanna. O ṣe pataki lati ṣe akiyesi pe apẹrẹ yii wulo fun ọpọlọpọ NoSQL-awọn ipinnu.

Ilana yii ni a npe ni ọna wiwa tabi pagination keyset. O yanju iṣoro abajade lilefoofo (akọsilẹ: ipo pẹlu kikọ laarin awọn iwe kika ti a ṣalaye tẹlẹ) ati, nitorinaa, ohun ti gbogbo wa nifẹ, o ṣiṣẹ ni iyara ati iduroṣinṣin diẹ sii ju aiṣedeede Ayebaye. Iduroṣinṣin wa ni otitọ pe akoko ṣiṣe ibeere ko pọ si ni ibamu si nọmba ti tabili ti o beere (akọsilẹ: ti o ba fẹ lati ni imọ siwaju sii nipa iṣẹ ti awọn ọna oriṣiriṣi si pagination, o le wo nipasẹ awọn onkowe ká igbejade. O tun le wa awọn ipilẹ afiwera fun awọn ọna oriṣiriṣi nibẹ).

Ọkan ninu awọn kikọja sọrọ nipa iyẹnpe pagination nipasẹ awọn bọtini, dajudaju, ni ko omnipotent - o ni awọn oniwe-idiwọn. Pataki julọ ni pe ko ni agbara lati ka awọn oju-iwe laileto (akọsilẹ: aisedede). Sibẹsibẹ, ni akoko ti lilọ kiri ailopin (akọsilẹ: ni iwaju iwaju), eyi kii ṣe iru iṣoro bẹ. Pato nọmba oju-iwe kan fun titẹ jẹ ipinnu buburu ni apẹrẹ UI lonakona (akọsilẹ: ero ti onkọwe nkan naa).

Kini nipa awọn irinṣẹ?

Pagination lori awọn bọtini nigbagbogbo ko dara nitori aini atilẹyin ohun elo fun ọna yii. Pupọ julọ awọn irinṣẹ idagbasoke, pẹlu ọpọlọpọ awọn ilana, ko gba ọ laaye lati yan gangan bi a ṣe le ṣe pagination.

Ipo naa buru si nipasẹ otitọ pe ọna ti a ṣalaye nilo atilẹyin ipari-si-opin ninu awọn imọ-ẹrọ ti a lo - lati DBMS si ipaniyan ti ibeere AJAX ninu ẹrọ aṣawakiri pẹlu lilọ kiri ailopin. Dipo sisọ nọmba oju-iwe nikan, o ni bayi lati pato ṣeto awọn bọtini fun gbogbo awọn oju-iwe ni ẹẹkan.

Sibẹsibẹ, nọmba awọn ilana ti o ṣe atilẹyin pagination lori awọn bọtini n dagba diẹdiẹ. Eyi ni ohun ti a ni ni akoko yii:

(Akiyesi: diẹ ninu awọn ọna asopọ ti yọkuro nitori otitọ pe ni akoko itumọ diẹ ninu awọn ile-ikawe kan ko ti ni imudojuiwọn lati ọdun 2017-2018. Ti o ba nifẹ, o le wo orisun atilẹba.)

O jẹ ni akoko yii pe iranlọwọ rẹ nilo. Ti o ba ṣe agbekalẹ tabi ṣe atilẹyin ilana kan ti o ṣe eyikeyi lilo ti pagination, lẹhinna Mo beere, Mo rọ, Mo bẹ ọ lati pese atilẹyin abinibi fun pagination lori awọn bọtini. Ti o ba ni awọn ibeere tabi nilo iranlọwọ, Emi yoo dun lati ṣe iranlọwọ (apero, twitter, olubasọrọ fọọmu) (akọsilẹ: lati iriri mi pẹlu Marcus, Mo le sọ pe o ni itara gaan nipa itankale koko yii).

Ti o ba lo awọn solusan ti a ti ṣetan ti o ro pe o yẹ lati ni atilẹyin fun pagination nipasẹ awọn bọtini, ṣẹda ibeere kan tabi paapaa pese ojutu ti a ti ṣetan, ti o ba ṣeeṣe. O tun le sopọ si nkan yii.

ipari

Idi ti iru ọna ti o rọrun ati iwulo gẹgẹbi pagination nipasẹ awọn bọtini kii ṣe ni ibigbogbo kii ṣe pe o nira lati ṣe ni imọ-ẹrọ tabi nilo igbiyanju nla eyikeyi. Idi akọkọ ni pe ọpọlọpọ ni aṣa lati rii ati ṣiṣẹ pẹlu aiṣedeede - ọna yii jẹ aṣẹ nipasẹ boṣewa funrararẹ.

Bi abajade, diẹ eniyan ronu nipa yiyipada ọna si pagination, ati nitori eyi, atilẹyin ohun elo lati awọn ilana ati awọn ile-ikawe ti n dagbasoke ni aibojumu. Nitorinaa, ti imọran ati ibi-afẹde ti pagination-ọfẹ aiṣedeede sunmọ ọ, ṣe iranlọwọ lati tan kaakiri!

orisun: https://use-the-index-luke.com/no-offset
Onkọwe: Markus Winand

orisun: www.habr.com

Fi ọrọìwòye kun