No ke aha ʻoe e makemake ai i ke kākoʻo instrumental no ka pagination ma nā kī?

Aloha kākou! He mea hoʻomohala hope wau e kākau ana i nā microservices ma Java + Spring. Hana wau i kekahi o nā hui hoʻomohala huahana kūloko ma Tinkoff.

No ke aha ʻoe e makemake ai i ke kākoʻo instrumental no ka pagination ma nā kī?

I kā mākou hui, ʻo ka nīnau o ka hoʻonui ʻana i nā nīnau ma kahi DBMS e kū pinepine ana. Makemake mau ʻoe e ʻoi aku ka wikiwiki, akā ʻaʻole hiki iā ʻoe ke loaʻa me nā ʻōlelo kuhikuhi i kūkulu ʻia me ka noʻonoʻo - pono ʻoe e ʻimi i kekahi mau workarounds. I loko o kekahi o kēia mau auwana a puni ka pūnaewele no ka ʻimi ʻana i nā loiloi kūpono i ka wā e hana ana me nā ʻikepili, ʻike wau ʻO ka moʻomanaʻo kōkua pau ʻole a Marcus Wynand, mea kākau o SQL Performance Explained. ʻO kēia kēlā ʻano blog kahi hiki iā ʻoe ke heluhelu i nā ʻatikala āpau i ka lālani.

Makemake au e unuhi i kahi ʻatikala pōkole na Marcus no ʻoe. Hiki ke kapa ʻia i kahi ʻano he manifesto e ʻimi nei e huki i ka manaʻo i ka wā kahiko, akā pili pono ka pilikia o ka hana o ka hana offset e like me ka maʻamau SQL.

Ma kekahi mau wahi e hoʻonui au i ka mea kākau me nā wehewehe a me nā manaʻo. E kuhikuhi wau i nā wahi āpau e like me "approx." no ka maopopo loa

Hoʻolauna liʻiliʻi

Manaʻo wau he nui ka poʻe i ʻike i ka pilikia a me ka lohi o ka hana ʻana me ka ʻaoʻao koho ma o offset. Ua ʻike paha ʻoe hiki ke maʻalahi ke hoʻololi ʻia me kahi hoʻolālā ʻoi aku ka maikaʻi?

No laila, haʻi ka huaʻōlelo offset i ka ʻikepili e hoʻokuʻu i nā n moʻolelo mua i ka noi. Eia nō naʻe, pono e heluhelu ka waihona i kēia mau n mooolelo mua mai ka diski, ma ke kauoha i hāʻawi ʻia (nota: e hoʻopili i ka hoʻokaʻawale ʻana inā ʻōlelo ʻia), a laila hiki ke hoʻihoʻi i nā moʻolelo mai n+1 ma luna. ʻO ka mea hoihoi loa, ʻaʻole ka pilikia i ka hoʻokō kikoʻī i ka DBMS, akā i ka wehewehe kumu e like me ka maʻamau:

… hoʻokaʻawale mua ʻia nā lālani e like me ka a laila kaupalena ʻia ma ka waiho ʻana i ka helu o nā lālani i kuhikuhi ʻia ma ka mai ka hoʻomaka…
-SQL:2016, Māhele 2, 4.15.3 Nā papa i loaʻa (meka: i kēia manawa ka maʻamau i hoʻohana nui ʻia)

ʻO ka mea nui ma ʻaneʻi, ʻo ka offset e lawe i kahi ʻāpana hoʻokahi - ka helu o nā moʻolelo e lele ai, a ʻo ia nō. Ma hope o kēia wehewehe ʻana, hiki i ka DBMS ke kiʻi wale i nā moʻolelo āpau a laila hoʻolei i nā mea pono ʻole. ʻIke loa, ʻo kēia wehewehe ʻana o ka offset e koi iā mākou e hana i nā hana ʻē aʻe. A ʻaʻole ia he mea nui inā he SQL a i ʻole NoSQL.

He ʻeha iki wale nō

ʻAʻole pau nā pilikia me ka offset, a eia ke kumu. Inā, ma waena o ka heluhelu ʻana i ʻelua ʻaoʻao o ka ʻikepili mai ka diski, hoʻokomo kekahi hana hou i kahi moʻolelo hou, he aha ka mea e hiki mai i kēia hihia?

No ke aha ʻoe e makemake ai i ke kākoʻo instrumental no ka pagination ma nā kī?

Ke hoʻohana ʻia ka offset e hoʻokuʻu i nā moʻolelo mai nā ʻaoʻao i hala, i ke kūlana o ka hoʻohui ʻana i kahi moʻolelo hou ma waena o nā heluhelu o nā ʻaoʻao like ʻole, e loaʻa paha iā ʻoe nā kope kope (nota: hiki kēia ke heluhelu mākou i kēlā me kēia ʻaoʻao me ka hoʻohana ʻana i ke kauoha ma ke kūkulu ʻana, a laila ma ka waena o kā mākou hoʻopuka e loaʻa paha kahi komo hou).

Hōʻike maopopo ke kiʻi i kēia kūlana. Heluhelu ka waihona i nā moʻolelo 10 mua, ma hope o ka hoʻokomo ʻana i kahi moʻolelo hou, e hoʻopau i nā moʻolelo heluhelu a pau e 1. A laila lawe ka waihona i kahi ʻaoʻao hou mai nā moʻolelo 10 e hiki mai ana a hoʻomaka ʻaʻole mai ka 11th, e like me ka mea e pono ai, akā mai ka 10, e hana hou ana i keia mooolelo. Aia kekahi anomalies e pili ana i ka hoʻohana ʻana i kēia ʻōlelo, akā ʻo kēia ka mea maʻamau.

E like me kā mākou i ʻike mua ai, ʻaʻole kēia nā pilikia o kahi DBMS kikoʻī a i ʻole kā lākou hoʻokō. ʻO ka pilikia ma ka wehewehe ʻana i ka pagination e like me ka maʻamau SQL. Hōʻike mākou i ka DBMS i ka ʻaoʻao e kiʻi ai a i ʻole ka nui o nā moʻolelo e lele ai. ʻAʻole hiki i ka waihona ke hoʻopaʻa pono i kēlā noi, no ka mea he liʻiliʻi ka ʻike no kēia.

He mea kūpono hoʻi ka wehewehe ʻana ʻaʻole kēia he pilikia me kahi huaʻōlelo kikoʻī, akā me nā semantics o ka nīnau. Aia kekahi mau syntax e like me ko lākou ʻano pilikia:

  • ʻO ka huaʻōlelo offset e like me ka mea i ʻōlelo ʻia ma mua.
  • ʻO ke kūkulu ʻana i ʻelua huaʻōlelo palena palena [offset] (ʻoiai ʻaʻole ʻino loa ka palena ponoʻī).
  • Kānana ma nā palena haʻahaʻa, ma muli o ka helu ʻana i ka lālani (no ka laʻana, row_number(), rownum, etc.).

Hōʻike wale kēia mau ʻōlelo a pau iā ʻoe i ka nui o nā laina e lele ai, ʻaʻohe ʻike hou a me ka pōʻaiapili.

Ma hope o kēia ʻatikala, hoʻohana ʻia ka huaʻōlelo offset ma ke ʻano he hōʻuluʻulu o kēia mau koho āpau.

Ke ola me ka OFFSET

E noʻonoʻo kākou i ke ʻano o ko kākou honua me ka ʻole o kēia mau pilikia. ʻIke ʻia ʻaʻole paʻakikī ke ola me ka ʻole o ka offset: me kahi koho, hiki iā ʻoe ke koho wale i kēlā mau lālani a mākou i ʻike ʻole ai (nānā: ʻo ia hoʻi, nā mea ʻaʻole ma ka ʻaoʻao mua), me ka hoʻohana ʻana i kahi kūlana ma kahi.

I kēia hihia, hoʻomaka mākou mai ka ʻoiaʻiʻo ua hoʻokō ʻia nā koho ma kahi hoʻonohonoho i kauoha ʻia (maikaʻi kahiko kauoha e). No ka mea ua kauoha ʻia mākou, hiki iā mākou ke hoʻohana i kahi kānana maʻalahi no ka loaʻa ʻana o ka ʻikepili ma hope o ka moʻolelo hope o ka ʻaoʻao mua:

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

ʻO ia ke kumu holoʻokoʻa o kēia ala. ʻOiaʻiʻo, ʻoi aku ka leʻaleʻa o nā mea ke hoʻokaʻawale ʻia e nā kolamu he nui, akā mau ka manaʻo. He mea nui e hoʻomaopopo e pili ana kēia hoʻolālā i nā mea he nui NoSQL-nā hoʻoholo.

Kapa ʻia kēia ʻano hana ʻimi a i ʻole keyset pagination. Hoʻoponopono ia i ka pilikia hopena lana (noka: ke kūlana me ke kākau ʻana ma waena o ka heluhelu ʻana i ka ʻaoʻao, i wehewehe mua ʻia) a, ʻoiaʻiʻo, ʻo ka mea a mākou e aloha ai, ʻoi aku ka wikiwiki a ʻoi aku ka paʻa ma mua o ka offset maʻamau. Aia ka paʻa i ka ʻoiaʻiʻo ʻaʻole e hoʻonui ka manawa hana noi i ka helu o ka papa i noi ʻia (nota: inā makemake ʻoe e aʻo hou e pili ana i ka hana o nā ala like ʻole i ka pagination, hiki iā ʻoe ke e nana i ka hoike a ka mea kakau. Hiki iā ʻoe ke ʻike i nā pae hoʻohālikelike no nā ʻano hana like ʻole ma laila).

ʻO kekahi o nā paheʻe kamaʻilio e pili ana i kēlāʻO kēlā pagination e nā kī, ʻoiaʻiʻo, ʻaʻole mana loa - aia kona mau palena. ʻO ka mea nui loa, ʻaʻole hiki iā ia ke heluhelu i nā ʻaoʻao maʻamau (note: inconsistently). Eia naʻe, i ke au o ka ʻōwili pau ʻole (nota: ma ka ʻaoʻao mua), ʻaʻole ia he pilikia. ʻO ka wehewehe ʻana i kahi helu ʻaoʻao no ke kaomi ʻana he hoʻoholo maikaʻi ʻole i ka hoʻolālā UI (nota: manaʻo o ka mea kākau o ka ʻatikala).

Pehea na mea paahana?

ʻAʻole kūpono ka helu helu ma nā kī ma muli o ka nele o ke kākoʻo mea kani no kēia ʻano. ʻAʻole ʻae ka hapa nui o nā mea hana hoʻomohala, me nā ʻano hana like ʻole, e koho pololei i ka hana ʻana o ka pagination.

Hoʻonui ʻia ke kūlana ma ka ʻoiaʻiʻo o ke ʻano i wehewehe ʻia e koi i ke kākoʻo hope-to-end i nā ʻenehana i hoʻohana ʻia - mai ka DBMS a hiki i ka hoʻokō ʻana i kahi noi AJAX i ka polokalamu me ka ʻōwili pau ʻole. Ma kahi o ka helu ʻana i ka helu ʻaoʻao wale nō, pono ʻoe e kuhikuhi i kahi pūʻulu kī no nā ʻaoʻao āpau i ka manawa hoʻokahi.

Eia naʻe, ke ulu mālie nei ka helu o nā frameworks e kākoʻo ana i ka pagination ma nā kī. Eia kā mākou i kēia manawa:

(E hoʻomaopopo: ua wehe ʻia kekahi mau loulou ma muli o ka manawa o ka unuhi ʻana ʻaʻole i hōʻano hou ʻia kekahi mau hale waihona puke mai 2017-2018. Inā makemake ʻoe, hiki iā ʻoe ke nānā i ke kumu kumu.)

I kēia manawa e pono ai kāu kōkua. Inā hoʻomohala ʻoe a kākoʻo paha i kahi hoʻolālā e hoʻohana ai i ka pagination, a laila ke noi aku nei au, ke noi aku nei au iā ʻoe e hāʻawi i ke kākoʻo maoli no ka pagination ma nā kī. Inā he nīnau kāu a makemake paha i ke kōkua, e hauʻoli wau e kōkua (ka hui, Twitter, palapala hoʻopili).

Inā hoʻohana ʻoe i nā hāʻina i mākaukau ʻia āu e manaʻo ai he kūpono ke kākoʻo ʻana i ka pagination ma nā kī, e hana i kahi noi a hāʻawi paha i kahi hopena mākaukau, inā hiki. Hiki iā ʻoe ke loulou i kēia ʻatikala.

hopena

ʻO ke kumu o ka laha ʻole ʻana o kahi ala maʻalahi a me ka pono e like me ka pagination ma nā kī ʻaʻole ia he paʻakikī ke hoʻokō ʻenehana a i ʻole ke koi ʻana i kahi hoʻoikaika nui. ʻO ke kumu nui ʻo ia ka poʻe i maʻa i ka ʻike a me ka hana ʻana me ka offset - ua kuhikuhi ʻia kēia ala e ka maʻamau ponoʻī.

ʻO ka hopena, he kakaikahi ka poʻe e noʻonoʻo nei e hoʻololi i ke ala i ka pagination, a ma muli o kēia, ke ulu maikaʻi nei ke kākoʻo mea kani mai nā frameworks a me nā hale waihona puke. No laila, inā kokoke iā ʻoe ka manaʻo a me ka pahuhopu o ka offset-free pagination, e kōkua i ka hoʻolaha ʻana!

Source: https://use-the-index-luke.com/no-offset
Mea kākau: Markus Winand

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka