E hōʻalo i ka hoʻohana ʻana iā OFFSET a me LIMIT i nā nīnau pili

Ua hala nā lā ʻaʻole ʻoe hopohopo e pili ana i ka hoʻokō ʻana i ka ʻikepili. ʻAʻole kū mālie ka manawa. Makemake nā mea ʻenehana hou e hana i ka Facebook e hiki mai ana, ʻoiai e hoʻāʻo ana e hōʻiliʻili i nā ʻikepili āpau i hiki iā lākou ke loaʻa i ko lākou mau lima. Pono nā ʻoihana i kēia ʻikepili e hoʻomaʻamaʻa maikaʻi i nā kumu hoʻohālike e kōkua iā lākou e loaʻa kālā. Ma ia mau kūlana, pono nā polokalamu polokalamu e hana i nā API e hiki ai iā lākou ke hana wikiwiki a hilinaʻi me ka nui o ka ʻike.

E hōʻalo i ka hoʻohana ʻana iā OFFSET a me LIMIT i nā nīnau pili

Inā ʻoe e hoʻolālā ana i ka palapala noi a i ʻole ka waihona waihona hope no kekahi lōʻihi o ka manawa, ua kākau paha ʻoe i ke code e holo i nā nīnau paginated. No ka laʻana, e like me kēia:

SELECT * FROM table_name LIMIT 10 OFFSET 40

Pehea ia?

Akā inā pēlā ʻoe i hana ai i kāu pagination, kala wau e ʻōlelo ʻaʻole ʻoe i hana ma ke ʻano kūpono loa.

Makemake ʻoe e kūʻē mai iaʻu? Hiki paha iā 'oe ole hoʻolilo kālā ka manawa. Slack, Shopify и Mixmax Ke hoʻohana nei lākou i nā ʻenehana aʻu e makemake ai e kamaʻilio e pili ana i kēia lā.

E inoa i hoʻokahi mea hoʻomohala hope ʻaʻole i hoʻohana OFFSET и LIMIT e hana i nā nīnau paginated. Ma MVP (Minimum Viable Product) a ma nā papahana kahi i hoʻohana ʻia ai nā helu liʻiliʻi, pili pono kēia ala. "Hoʻohana wale ia," pēlā e ʻōlelo ai.

Akā inā pono ʻoe e hana i nā ʻōnaehana hilinaʻi a maikaʻi hoʻi mai ka wā ʻōpala, pono ʻoe e mālama mua i ka pono o ka nīnau ʻana i nā ʻikepili i hoʻohana ʻia i ia ʻōnaehana.

I kēia lā, e kamaʻilio mākou e pili ana i nā pilikia me ka hoʻohana maʻamau (ʻino ʻole) ka hoʻokō ʻana i nā ʻenekini hulina paginated, a pehea e hoʻokō ai i ka hana kiʻekiʻe i ka wā e hoʻokō ai i kēlā mau nīnau.

He aha ka hewa me OFFSET a me LIMIT?

E like me ka mea i ʻōlelo ʻia, OFFSET и LIMIT Hana maikaʻi lākou i nā papahana ʻaʻole pono e hana me ka nui o ka ʻikepili.

Piʻi ka pilikia i ka ulu ʻana o ka waihona i ka nui a ʻaʻole kūpono i ka hoʻomanaʻo o ke kikowaena. Eia naʻe, i ka hana ʻana me kēia waihona, pono ʻoe e hoʻohana i nā nīnau paginated.

No kēia pilikia e hōʻike iā ia iho, pono e loaʻa kahi kūlana e hoʻohana ai ka DBMS i kahi hana ʻike piha piha piha ʻole i kēlā me kēia hulina helu helu (ʻoiai e hiki mai ana nā hana hoʻokomo a me ka holoi ʻana, ʻaʻole pono mākou i ka ʻikepili kahiko!).

He aha ke ʻano o ka "scan table scan" (a i ʻole "sequential table scan", Sequential Scan)? He hana kēia e heluhelu ai ka DBMS i kēlā me kēia lālani o ka pākaukau, ʻo ia hoʻi, nā ʻikepili i loko, a nānā iā lākou no ka hoʻokō ʻana i kahi kūlana i hāʻawi ʻia. ʻIke ʻia ʻo kēia ʻano o ka nānā ʻana i ka papa ʻaina ka lohi loa. ʻO ka ʻoiaʻiʻo, i ka wā e hoʻokō ʻia ai, hana ʻia nā hana hoʻokomo/puka he nui e pili ana i ka subsystem disk o ka server. Hoʻonui ʻia ke kūlana ma muli o ka latency e pili ana i ka hana ʻana me ka ʻikepili i mālama ʻia ma nā disks, a ʻo ka hoʻololi ʻana i ka ʻikepili mai ka disk i ka hoʻomanaʻo he hana koʻikoʻi.

No ka laʻana, loaʻa iā ʻoe nā moʻolelo o 100000000 mau mea hoʻohana a holo ʻoe i kahi nīnau me ke kūkulu OFFSET 50000000. ʻO ia ke ʻano o ka DBMS e hoʻouka i kēia mau moʻolelo āpau (a ʻaʻole pono mākou iā lākou!), hoʻokomo iā lākou i loko o ka hoʻomanaʻo, a ma hope o kēlā lawe, e ʻōlelo, 20 nā hopena i hōʻike ʻia ma LIMIT.

E ʻōlelo kākou penei: "koho i nā lālani mai 50000 a 50020 mai 100000". ʻO ia hoʻi, pono mua ka ʻōnaehana e hoʻouka i nā lālani 50000 e hoʻopau i ka nīnau. ʻIke ʻoe i ka nui o kāna hana pono ʻole e hana ai?

Inā ʻaʻole ʻoe e manaʻoʻiʻo mai iaʻu, e nānā i ka laʻana aʻu i hana ai me ka hoʻohana ʻana i nā hiʻohiʻona db-fiddle.com

E hōʻalo i ka hoʻohana ʻana iā OFFSET a me LIMIT i nā nīnau pili
Laʻana ma db-fiddle.com

Aia, ma ka hema, ma ke kula Schema SQL, aia ke code e hoʻokomo i nā lālani 100000 i loko o ka waihona, a ma ka ʻākau, ma ke kahua. Query SQL, hōʻike ʻia nā nīnau ʻelua. ʻO ka mua, lohi, e like me kēia:

SELECT *
FROM `docs`
LIMIT 10 OFFSET 85000;

A ʻo ka lua, he hopena maikaʻi ia i ka pilikia like, penei:

SELECT *
FROM `docs`
WHERE id > 85000
LIMIT 10;

I mea e hoʻokō ai i kēia mau noi, e kaomi wale i ke pihi Run ma luna o ka ʻaoʻao. Ma hope o kēia, hoʻohālikelike mākou i ka ʻike e pili ana i ka manawa hoʻokō nīnau. ʻIke ʻia ʻo ka hoʻokō ʻana i kahi nīnau kūpono ʻole he 30 mau manawa lōʻihi ma mua o ka hoʻokō ʻana i ka lua (ʻokoʻa kēia manawa mai ka holo a hiki i ka holo; no ka laʻana, hōʻike paha ka ʻōnaehana ua lawe ka nīnau mua i 37 ms e hoʻopau, akā ʻo ka hoʻokō ʻana o ka lua - 1 ms).

A inā ʻoi aku ka nui o ka ʻikepili, a laila e ʻoi aku ka maikaʻi o nā mea āpau (e hōʻoia i kēia, e nānā i kaʻu hiʻohiʻona me 10 miliona lālani).

ʻO ka mea a mākou i kamaʻilio ai e hāʻawi iā ʻoe i kahi ʻike i ke ʻano o ka hana ʻana i nā nīnau waihona.

E ʻoluʻolu e hoʻomaopopo i ka kiʻekiʻe o ka waiwai OFFSET — ʻoi aku ka lōʻihi o ka hoʻokō ʻana o ka noi.

He aha kaʻu e hoʻohana ai ma kahi o ka hui ʻana o OFFSET a me LIMIT?

Ma kahi o kahi hui OFFSET и LIMIT Pono ka hoʻohana ʻana i kahi hale i kūkulu ʻia e like me ka hoʻolālā aʻe:

SELECT * FROM table_name WHERE id > 10 LIMIT 20

ʻO kēia ka hoʻokō ʻana i ka nīnau me ka hoʻohana ʻana i ka cursor.

Ma kahi o ka mālama ʻana i nā mea i kēia manawa ma ka ʻāina OFFSET и LIMIT a hoʻouna iā lākou me kēlā me kēia noi, pono ʻoe e mālama i ke kī mua loa i loaʻa (ʻo ka maʻamau kēia ID) a LIMIT, ʻo ka hopena, e loaʻa nā nīnau e like me ka mea i luna.

No ke aha mai? ʻO ka manaʻo, ma ka wehewehe pono ʻana i ka mea hōʻike o ka lālani hope i heluhelu ʻia, e haʻi ʻoe i kāu DBMS kahi e hoʻomaka ai e ʻimi i ka ʻikepili pono. Eia kekahi, ʻo ka ʻimi, mahalo i ka hoʻohana ʻana i ke kī, e hoʻokō pono ʻia; ʻaʻole pono e hoʻopili ʻia ka ʻōnaehana e nā laina ma waho o ka pae i kuhikuhi ʻia.

E nānā kākou i kēia hoʻohālikelike hana o nā nīnau like ʻole. Eia kahi nīnau kūpono ʻole.

E hōʻalo i ka hoʻohana ʻana iā OFFSET a me LIMIT i nā nīnau pili
Noi lohi

A eia kahi mana hoʻopono o kēia noi.

E hōʻalo i ka hoʻohana ʻana iā OFFSET a me LIMIT i nā nīnau pili
Noi wikiwiki

Hoʻihoʻi like nā nīnau ʻelua i ka nui o ka ʻikepili. Akā ʻo ka mea mua he 12,80 kekona e hoʻopau ai, a ʻo ka lua he 0,01 kekona. Manaʻo ʻoe i ka ʻokoʻa?

ʻO nā pilikia paha

I mea e hana maikaʻi ai ke ʻano noiʻi i manaʻo ʻia, pono e loaʻa i ka papaʻaina kahi kolamu (a i ʻole nā ​​kolamu) i loaʻa nā kuhikuhi kikoʻī kūʻokoʻa, e like me ka helu helu helu. I kekahi mau hihia kūikawā, hiki i kēia ke hoʻoholo i ka holomua o ka hoʻohana ʻana i ia mau nīnau e hoʻonui i ka wikiwiki o ka hana ʻana me ka waihona.

ʻO ka mea maʻamau, i ke kūkulu ʻana i nā nīnau, pono ʻoe e noʻonoʻo i ka hoʻolālā kikoʻī o nā papaʻaina a koho i kēlā mau mīkini e hana maikaʻi loa i nā papa i loaʻa. No ka laʻana, inā pono ʻoe e hana i nā nīnau me ka nui o nā ʻikepili pili, ʻike paha ʻoe i ka hoihoi kēia ʻatikala.

Inā kū mākou i ka pilikia o ka nalo ʻana i kahi kī nui, no ka laʻana, inā loaʻa iā mākou kahi papaʻaina me kahi pilina he nui-a-nui, a laila ke ala kuʻuna o ka hoʻohana ʻana. OFFSET и LIMIT, ua hōʻoia ʻia e kūpono iā mākou. Akā ʻo kona hoʻohana ʻana e hopena paha i nā nīnau lohi. I kēlā mau hihia, makemake wau e hoʻohana i kahi kī nui hoʻonui auto-incrementing, ʻoiai inā pono ia e mālama i nā nīnau paginated.

Inā makemake ʻoe i kēia kumuhana - aia hoʻi, aia hoʻi и aia hoʻi - kekahi mau mea pono.

Nā hopena

ʻO ka hopena nui e hiki iā mākou ke huki, ʻo ia ka nui o nā waihona ʻikepili a mākou e kamaʻilio nei, pono mau ke kālailai i ka wikiwiki o ka hoʻokō ʻana i ka nīnau. I kēia mau lā, he mea koʻikoʻi ka scalability o nā hoʻonā, a inā i hoʻolālā pololei ʻia nā mea āpau mai ka hoʻomaka ʻana o ka hana ʻana ma kekahi ʻōnaehana, hiki i kēia, i ka wā e hiki mai ana, ke hoʻopakele i ka mea hoʻomohala mai nā pilikia he nui.

Pehea ʻoe e kālailai a hoʻopaʻa pono i nā nīnau waihona?

E hōʻalo i ka hoʻohana ʻana iā OFFSET a me LIMIT i nā nīnau pili

Source: www.habr.com

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