Nahoana ianao no mila fanohanana fitaovana amin'ny pagination amin'ny fanalahidy?

Salama daholo! Mpanamboatra backend manoratra microservices amin'ny Java + Spring aho. Miasa amin'ny iray amin'ireo ekipa fampandrosoana vokatra anatiny ao amin'ny Tinkoff aho.

Nahoana ianao no mila fanohanana fitaovana amin'ny pagination amin'ny fanalahidy?

Ao amin'ny ekipanay dia matetika mipoitra ny fanontaniana momba ny fanatsarana ny fanontaniana amin'ny DBMS. Te-ho haingana kokoa foana ianao, saingy tsy afaka mandalo amin'ny fanondroana voaorina tsara ianao - mila mitady vahaolana ianao. Nandritra ny iray amin'ireo fitetezam-paritra ireo amin'ny Internet mba hitady fanatsarana mety rehefa miasa miaraka amin'ny angon-drakitra, dia nahita aho. Blaogin'i Marcus Wynand manampy tsy misy farany, mpanoratra ny SQL Performance Explained. Ity no karazana bilaogy tsy fahita firy izay ahafahanao mamaky ny lahatsoratra rehetra misesy.

Te handika lahatsoratra fohy nosoratan'i Marcus ho anao aho. Azo antsoina amin'ny lafiny sasany ny manifesto izay mitady hisarihana ny saina ho amin'ny taloha, fa mbola manan-danja olana ny fanatanterahana ny offset asa araka ny SQL fenitra.

Any amin'ny toerana sasany dia hanampy ny mpanoratra amin'ny fanazavana sy fanehoan-kevitra aho. Hantsoiko hoe β€œeo ho eo” ireo toerana rehetra ireo. mba ho mazava kokoa

Fampidirana kely

Heveriko fa maro ny olona mahafantatra ny olana sy miadana miasa amin'ny fisafidianana pejy amin'ny alΓ lan'ny offset. Fantatrao ve fa azo soloina mora kokoa amin'ny endrika mahomby kokoa izy io?

Noho izany, ny teny fanalahidy offset dia milaza amin'ny angon-drakitra mba hitsambikina ny rakitra n voalohany amin'ny fangatahana. Na izany aza, ny angon-drakitra dia mbola mila mamaky ireo voalohany n rakitra avy amin'ny kapila, amin'ny filaharana nomena (fanamarihana: ampiharo ny fanasokajiana raha voatondro), ary avy eo vao azo atao ny mamerina ny rakitra manomboka amin'ny n+1. Ny tena mahaliana dia ny olana dia tsy amin'ny fampiharana manokana ao amin'ny DBMS, fa amin'ny famaritana tany am-boalohany araka ny fenitra:

… ny andalana dia alahatra aloha araka ny ary avy eo dia voafetra amin'ny alalan'ny fandatsahana ny isan'ny andalana voatondro ao amin'ny hatrany am-piandohana...
-SQL:2016, Fizarana 2, 4.15.3 Tabilao derivΓ© (fanamarihana: fenitra ampiasaina indrindra amin'izao fotoana izao)

Ny teboka manan-danja eto dia ny hoe ny offset dia maka paramètre tokana - ny isan'ny firaketana an-tsoratra, ary izay ihany. Manaraka io famaritana io, ny DBMS dia tsy afaka maka ny rakitsoratra rehetra ary avy eo manary ireo tsy ilaina. Mazava ho azy fa manery antsika hanao asa fanampiny io famaritana ny offset io. Ary tsy maninona na SQL na NoSQL.

Fanaintainana kely fotsiny

Tsy mifarana eo ny olana amin'ny offset, ary izao no antony. Raha, eo anelanelan'ny famakiana pejy roa amin'ny angon-drakitra avy amin'ny kapila, misy hetsika hafa mampiditra rakitra vaovao, inona no hitranga amin'ity tranga ity?

Nahoana ianao no mila fanohanana fitaovana amin'ny pagination amin'ny fanalahidy?

Rehefa ampiasaina ny offset handingana rakitsoratra avy amin'ny pejy teo aloha, amin'ny toe-javatra manampy rakitsoratra vaovao eo anelanelan'ny famakiana pejy samihafa, dia azo inoana fa hahazo dika mitovy ianao (fanamarihana: azo atao izany rehefa mamaky pejy isan-pejy amin'ny fampiasana ny baiko amin'ny fananganana, avy eo eo afovoan'ny fivoahanay dia mety hahazo fidirana vaovao).

Ny tarehimarika dia mampiseho mazava io toe-javatra io. Ny fototra dia mamaky ireo rakitsoratra 10 voalohany, ary aorian'izay dia misy rakitsoratra vaovao ampidirina, izay manafoana ny rakitsoratra rehetra novakiana amin'ny 1. Avy eo ny fototra dia maka pejy vaovao avy amin'ireo rakitsoratra 10 manaraka ary tsy manomboka amin'ny faha-11, araka ny tokony ho izy, fa avy amin'ny faha-10, mandika ity rakitsoratra ity. Misy anomalies hafa mifandray amin'ny fampiasana an'io fomba fiteny io, fa io no mahazatra indrindra.

Araka ny efa hitantsika dia tsy olana amin'ny DBMS manokana na ny fampiharana azy ireo. Ny olana dia amin'ny famaritana pagination araka ny fenitra SQL. Lazainay amin'ny DBMS izay pejy alaina na firy ny rakitsoratra tokony hotsidihina. Ny angon-drakitra dia tsy afaka manatsara ny fangatahana toy izany, satria kely loatra ny fampahalalana momba izany.

Tsara ihany koa ny manazava fa tsy olana amin'ny teny fanalahidy manokana izany, fa amin'ny semantika amin'ny fangatahana. Misy syntax maromaro hafa mitovy amin'ny maha-olana azy:

  • Ny teny fanalahidy offset dia araka ny voalaza teo aloha.
  • Fanamboarana teny fanalahidy roa mametra [offset] (na dia tsy dia ratsy loatra aza ny fetra).
  • Sivana amin'ny sisiny ambany, mifototra amin'ny laharan'ny laharana (ohatra, row_number(), rownum, sns.).

Ireo fomba fiteny rehetra ireo dia milaza aminao fotsiny hoe firy ny andalana tokony hotsidihana, tsy misy fampahalalana fanampiny na contexte.

Taty aoriana ato amin'ity lahatsoratra ity, ny teny fanalahidy offset dia ampiasaina ho famintinana ireo safidy rehetra ireo.

Fiainana tsy misy OFFSET

Andeha hojerentsika izao hoe hanao ahoana ny tontolontsika raha tsy misy ireo olana rehetra ireo. Hita fa tsy dia sarotra loatra ny fiainana tsy misy offset: miaraka amin'ny voafantina dia azonao atao ny misafidy ireo andalana izay mbola tsy hitantsika (fanamarihana: izany hoe ireo izay tsy teo amin'ny pejy teo aloha), mampiasa fepetra iray.

Amin'ity tranga ity, manomboka amin'ny zava-misy fa ny fifantenana dia tanterahana amin'ny seta voadidy (baiko taloha tsara amin'ny). Koa satria manana andiana voabaiko izahay dia afaka mampiasa sivana tsotra fotsiny mba hahazoana ny angona ao ambadiky ny rakitra farany amin'ny pejy teo aloha ihany:

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

Izany no fitsipika manontolo amin'ity fomba fiasa ity. Mazava ho azy fa lasa mahafinaritra kokoa ny zava-drehetra rehefa asiana tsanganana maro, fa ny hevitra dia mbola tsy miova. Zava-dehibe ny manamarika fa ity endrika ity dia azo ampiharina amin'ny maro NoSQL- fanapahan-kevitra.

Ity fomba fiasa ity dia antsoina hoe fomba fitadiavana na keyset pagination. Izy io dia mamaha ny olan'ny vokatra mitsingevana (fanamarihana: ny toe-javatra misy ny fanoratana eo anelanelan'ny pejy izay novakiana teo aloha) ary mazava ho azy, izay tiantsika rehetra dia miasa haingana kokoa sy miorina kokoa noho ny offset mahazatra. Ny fahamarinan-toerana dia ny hoe tsy mitombo ny fotoana fikarakarana ny fangatahana amin'ny isan'ny latabatra nangatahana (fanamarihana: raha te hianatra bebe kokoa momba ny asan'ny fomba fiasa samihafa amin'ny pagination ianao, dia azonao atao jereo ny famelabelaran'ny mpanoratra. Azonao atao koa ny mahita benchmark fampitahana amin'ny fomba samihafa any).

Iray amin'ireo slides miresaka momba izanyfa ny pagination amin'ny fanalahidy, mazava ho azy, dia tsy omnipotent - manana ny fetrany. Ny tena manan-danja dia ny tsy fahaizany mamaky pejy kisendrasendra (fanamarihana: tsy mifanaraka). Na izany aza, amin'ny vanim-potoanan'ny horonam-boky tsy misy fiafarana (fanamarihana: eo amin'ny farany ambony), tsy olana toy izany izany. Fanapahan-kevitra ratsy amin'ny famolavolana UI ihany koa ny famaritana ny laharan'ny pejy hotsindriana (fanamarihana: hevitry ny mpanoratra ny lahatsoratra).

Ahoana ny amin'ny fitaovana?

Matetika tsy mety ny fanoratana pejy amin'ny fanalahidy noho ny tsy fisian'ny fanohanana fitaovana amin'ity fomba ity. Ny ankamaroan'ny fitaovana fampandrosoana, anisan'izany ny rafitra isan-karazany, dia tsy mamela anao hisafidy tsara ny fomba hanatanterahana ny pagination.

Miharatsy ny toe-draharaha noho ny zava-misy fa ny fomba voalaza dia mitaky fanohanana farany amin'ny teknolojia ampiasaina - manomboka amin'ny DBMS ka hatramin'ny fanatanterahana ny fangatahana AJAX ao amin'ny navigateur miaraka amin'ny horonana tsy misy farany. Raha tokony hilaza fotsiny ny laharan'ny pejy ianao, dia tsy maintsy manendry fanalahidy iray ho an'ny pejy rehetra indray mandeha ianao.

Na izany aza, mitombo tsikelikely ny isan'ny rafitra manohana ny pagination amin'ny fanalahidy. Ity ny zavatra ananantsika amin'izao fotoana izao:

(Fanamarihana: nesorina ny rohy sasany noho ny zava-misy fa tamin'ny fotoana nandikana ny tranomboky sasany dia tsy nohavaozina hatramin'ny taona 2017-2018. Raha liana ianao dia afaka mijery ny loharano voalohany.)

Amin'izao fotoana izao no ilaina ny fanampianao. Raha mamolavola na manohana rafitra iray izay mampiasa ny pagination ianao, dia mangataka aho, miangavy anao aho mba hanome fanohanana teratany ho an'ny pagination amin'ny fanalahidy. Raha manana fanontaniana ianao na mila fanampiana dia faly aho hanampy (ny forum, Twitter, endrika fifandraisana) (fanamarihana: avy amin'ny traikefako tamin'i Marcus dia azoko lazaina fa tena mafana fo izy amin'ny fanaparitahana ity lohahevitra ity).

Raha mampiasa vahaolana efa vita izay heverinao fa mendrika ny hahazo fanohanana ny pagination amin'ny alalan'ny fanalahidy ianao, mamorona fangatahana na manolotra vahaolana efa vita mihitsy aza, raha azo atao. Azonao atao koa ny mifandray amin'ity lahatsoratra ity.

famaranana

Ny antony tsy hiparitahan'ny fomba tsotra sy mahasoa toy ny pagination amin'ny alalan'ny fanalahidy dia tsy hoe sarotra ny mampihatra ara-teknika na mitaky ezaka lehibe. Ny antony lehibe dia satria maro no efa zatra mahita sy miasa amin'ny offset - io fomba fiasa io dia voabaikon'ny fenitra.

Vokatr'izany, vitsy ny olona mieritreritra ny hanova ny fomba fiasa amin'ny pagination, ary noho izany, ny fanohanana fitaovana avy amin'ny frameworks sy ny tranomboky dia tsy mivoatra. Noho izany, raha akaiky anao ny hevitra sy tanjona amin'ny pagination tsy misy offset, ampio ny manaparitaka azy!

Source: https://use-the-index-luke.com/no-offset
Mpanoratra: Markus Winand

Source: www.habr.com

Add a comment