Seachain a bhith a’ cleachdadh OFFSET agus LIMIT ann an ceistean air an duilleag

Tha na làithean air falbh nuair nach fheumadh tu a bhith draghail mu bhith a’ dèanamh an fheum as fheàrr de choileanadh stòr-dàta. Chan eil ùine a 'seasamh fhathast. Tha a h-uile neach-tionnsgain teignigeach ag iarraidh an ath Facebook a chruthachadh, agus iad a’ feuchainn ris an dàta gu lèir a chruinneachadh a gheibh iad an làmhan. Feumaidh gnìomhachasan an dàta seo gus modalan a thrèanadh nas fheàrr a chuidicheas iad gus airgead a dhèanamh. Ann an leithid de shuidheachaidhean, feumaidh luchd-prògramaidh APIan a chruthachadh a leigeas leotha obrachadh gu luath agus gu earbsach le tòrr fiosrachaidh.

Seachain a bhith a’ cleachdadh OFFSET agus LIMIT ann an ceistean air an duilleag

Ma tha thu air a bhith a’ dealbhadh cùl-fhiosrachaidhean tagraidh no stòr-dàta airson ùine sam bith, is dòcha gu bheil thu air còd a sgrìobhadh gus ceistean duilleag a ruith. Mar eisimpleir, mar seo:

SELECT * FROM table_name LIMIT 10 OFFSET 40

Mar a tha e?

Ach mas ann mar seo a rinn thu do dhuilleag, tha mi duilich a ràdh nach do rinn thu e anns an dòigh as èifeachdaiche.

A bheil thu airson a dhol na aghaidh? Faodaidh tu chan eil caitheamh время. Slack, Shopify и Mixmax Tha iad mu thràth a’ cleachdadh nan dòighean air a bheil mi airson bruidhinn an-diugh.

Ainmich co-dhiù aon leasaiche backend nach do chleachd a-riamh OFFSET и LIMIT gus ceistean pagined a dhèanamh. Ann am MVP (Bathar Soirbheachail as ìsle) agus ann am pròiseactan far a bheilear a’ cleachdadh beagan dàta, tha an dòigh-obrach seo gu math iomchaidh. Tha e “dìreach ag obair,” mar sin a bhruidhinn.

Ach ma dh'fheumas tu siostaman earbsach is èifeachdach a chruthachadh bhon fhìor thoiseach, bu chòir dhut a bhith faiceallach ro làimh mu èifeachdas ceasnachadh nan stòran-dàta a thathar a 'cleachdadh ann an leithid de shiostaman.

An-diugh bruidhnidh sinn mu na duilgheadasan le gnìomhachadh àbhaisteach (ro dhona) de dh’ einnseanan ceiste duilleag, agus mar as urrainn dhut àrd-choileanadh a choileanadh nuair a bhios tu a ’dèanamh cheistean mar sin.

Dè tha ceàrr air OFFSET agus LIMIT?

Mar a chaidh a ràdh cheana, OFFSET и LIMIT Bidh iad a 'coileanadh gu math ann am pròiseactan nach fheum a bhith ag obair le tomhas mòr de dhàta.

Bidh an duilgheadas ag èirigh nuair a dh’fhàsas an stòr-dàta cho mòr is nach eil e a’ freagairt air cuimhne an fhrithealaiche tuilleadh. Ach, nuair a bhios tu ag obair leis an stòr-dàta seo, feumaidh tu ceistean le duilleagan a chleachdadh.

Airson an duilgheadas seo a nochdadh fhèin, feumaidh suidheachadh a bhith ann far am bi an DBMS a’ dol gu gnìomhachd neo-èifeachdach Scan Làn-bhòrd air gach ceist duilleagach (fhad ‘s a dh’ fhaodadh gnìomhachd cuir a-steach is cuir às, agus chan eil feum againn air dàta seann-fhasanta!).

Dè a th’ ann an “sgan làn-bhòrd” (no “sgan clàr sreathach”, Sgan Sequential)? Is e gnìomh a tha seo far am bi an DBMS a’ leughadh gach sreath den chlàr ann an sreath, is e sin, an dàta a tha na bhroinn, agus gan sgrùdadh airson gèilleadh ri cumha sònraichte. Tha fios gur e an seòrsa sgrùdadh bùird seo an fheadhainn as slaodaiche. Is e an fhìrinn, nuair a thèid a chuir gu bàs, gu bheil mòran obrachaidhean cuir a-steach / toraidh air an coileanadh a tha a’ toirt a-steach fo-shiostam diosc an fhrithealaiche. Tha an suidheachadh air a dhèanamh nas miosa leis an latency co-cheangailte ri bhith ag obair le dàta air a stòradh air diosgan, agus leis gu bheil gluasad dàta bho diosc gu cuimhne na ghnìomhachd dian-ghoireasan.

Mar eisimpleir, tha clàran agad de 100000000 neach-cleachdaidh agus bidh thu a’ ruith ceist leis an togalach OFFSET 50000000. Tha seo a’ ciallachadh gum feum an DBMS na clàran sin uile a luchdachadh (agus chan eil eadhon feum againn orra!), Cuir mar chuimhneachan orra, agus às deidh sin gabh, can, 20 toradh air aithris ann an LIMIT.

Canaidh sinn gur dòcha gum bi e a’ coimhead mar seo: “tagh sreathan bho 50000 gu 50020 bho 100000”. Is e sin, feumaidh an siostam an toiseach 50000 sreath a luchdachadh gus a’ cheist a chrìochnachadh. A bheil thu a’ faicinn na tha de dh’ obair neo-riatanach a bhios aice ri dhèanamh?

Mura h-eil thu gam chreidsinn, thoir sùil air an eisimpleir a chruthaich mi a’ cleachdadh nam feartan db-fiddle.com

Seachain a bhith a’ cleachdadh OFFSET agus LIMIT ann an ceistean air an duilleag
Eisimpleir aig db-fiddle.com

An sin, air an taobh chlì, anns an raon Schema SQL, tha còd ann a chuireas 100000 sreathan a-steach don stòr-dàta, agus air an taobh cheart, san raon Query SQL, tha dà cheist air an sealltainn. Tha a’ chiad fhear, slaodach, a’ coimhead mar seo:

SELECT *
FROM `docs`
LIMIT 10 OFFSET 85000;

Agus tha an dàrna fear, a tha na fhuasgladh èifeachdach air an aon dhuilgheadas, mar seo:

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

Gus na h-iarrtasan sin a choileanadh, dìreach cliog air a’ phutan Run aig mullach na duilleige. An dèidh seo a dhèanamh, bidh sinn a’ dèanamh coimeas eadar fiosrachadh mu àm cur gu bàs na ceiste. Tha e coltach gu bheil e a’ toirt co-dhiù 30 tursan nas fhaide na bhith a’ cur an dàrna fear an gnìomh (bidh an turas seo ag atharrachadh bho ruith gu ruith; mar eisimpleir, faodaidh an siostam aithris gun tug a’ chiad cheist 37 ms airson a chrìochnachadh, ach chaidh an dàrna - 1 ms).

Agus ma tha barrachd dàta ann, bidh a h-uile dad a ’coimhead eadhon nas miosa (gus a bhith cinnteach mu dheidhinn seo, thoir sùil air mo chuid eisimpleir le 10 millean sreath).

Bu chòir na tha sinn air bruidhinn dìreach beagan sealladh a thoirt dhut air mar a tha ceistean stòr-dàta air an giullachd.

Thoir an aire gur ann as àirde a tha an luach OFFSET - mar as fhaide a bheir e gus an t-iarrtas a chrìochnachadh.

Dè a bu chòir dhomh a chleachdadh an àite a bhith a’ measgachadh OFFSET agus LIMIT?

An àite measgachadh OFFSET и LIMIT Is fhiach a bhith a 'cleachdadh structar a chaidh a thogail a rèir an sgeama a leanas:

SELECT * FROM table_name WHERE id > 10 LIMIT 20

Is e seo cur an gnìomh ceiste le duilleag stèidhichte air cùrsair.

An àite an fheadhainn gnàthach a stòradh gu h-ionadail OFFSET и LIMIT agus cuir thairis iad le gach iarrtas, feumaidh tu an iuchair bun-sgoile mu dheireadh a fhuaireadh a stòradh (mar as trice is e seo ID) agus LIMIT, mar thoradh air an sin, gheibhear ceistean coltach ris na tha gu h-àrd.

Carson? Is e a’ phuing, le bhith a’ sònrachadh gu soilleir aithnichear na loidhne mu dheireadh a chaidh a leughadh, gun innis thu don DBMS agad far am feum e tòiseachadh a’ lorg an dàta riatanach. A bharrachd air an sin, thèid an sgrùdadh, mar thoradh air cleachdadh na h-iuchrach, a dhèanamh gu h-èifeachdach; cha bhith feum air an t-siostam a bhith air a tharraing le loidhnichean taobh a-muigh an raon ainmichte.

Bheir sinn sùil air a’ choimeas dèanadais a leanas de dhiofar cheistean. Seo ceist neo-èifeachdach.

Seachain a bhith a’ cleachdadh OFFSET agus LIMIT ann an ceistean air an duilleag
Iarrtas slaodach

Agus seo dreach làn-leasaichte den iarrtas seo.

Seachain a bhith a’ cleachdadh OFFSET agus LIMIT ann an ceistean air an duilleag
Iarrtas luath

Bidh an dà cheist a 'tilleadh dìreach an aon uiread de dhàta. Ach bheir a’ chiad fhear 12,80 diog airson a chrìochnachadh, agus bheir an dàrna fear 0,01 diogan. A bheil thu a’ faireachdainn an diofar?

Duilgheadasan a dh'fhaodadh a bhith ann

Airson an dòigh ceiste a thathar a’ moladh a bhith ag obair gu h-èifeachdach, feumaidh colbh (no colbhan) a bhith air a’ chlàr anns a bheil clàran-amais àraid, sreathach, leithid aithnichear slòigh. Ann an cuid de chùisean sònraichte, dh’ fhaodadh seo dearbhadh dè cho soirbheachail ‘s a tha cleachdadh cheistean mar sin gus astar obrachadh leis an stòr-dàta àrdachadh.

Gu nàdarra, nuair a bhios tu a 'togail cheistean, feumaidh tu aire a thoirt do ailtireachd sònraichte nan clàran agus tagh na h-innealan sin a bhios ag obair as fheàrr air na clàran a th' ann mar-thà. Mar eisimpleir, ma dh'fheumas tu a bhith ag obair ann an ceistean le meudan mòra de dhàta co-cheangailte, is dòcha gum bi e inntinneach dhut seo artaigil.

Ma tha duilgheadas againn a bhith a’ call prìomh iuchair, mar eisimpleir, ma tha clàr againn le dàimh ioma-gu-mòran, an uairsin bidh an dòigh-obrach thraidiseanta a’ cleachdadh OFFSET и LIMIT, Tha e cinnteach gum bi e iomchaidh dhuinn. Ach dh’ fhaodadh a bhith ga chleachdadh ceistean a dh’ fhaodadh a bhith slaodach. Ann an leithid de shuidheachaidhean, bhithinn a’ moladh prìomh iuchair fèin-àrdachaidh a chleachdadh, eadhon ged nach eil feum air ach airson ceistean le duilleagan a làimhseachadh.

Ma tha ùidh agad sa chuspair seo - feuch, feuch и feuch - grunn stuthan feumail.

Builean

Is e am prìomh cho-dhùnadh as urrainn dhuinn a tharraing, ge bith dè an ìre de stòran-dàta air a bheil sinn a’ bruidhinn, gu bheil e an-còmhnaidh riatanach sgrùdadh a dhèanamh air astar coileanadh ceist. An-diugh, tha scalability fuasglaidhean air leth cudromach, agus ma tha a h-uile càil air a dhealbhadh gu ceart bhon fhìor thoiseach a bhith ag obair air siostam sònraichte, faodaidh seo, san àm ri teachd, an leasaiche a shàbhaladh bho iomadh duilgheadas.

Ciamar a nì thu mion-sgrùdadh agus as fheàrr air ceistean stòr-dàta?

Seachain a bhith a’ cleachdadh OFFSET agus LIMIT ann an ceistean air an duilleag

Source: www.habr.com

Cuir beachd ann