Yẹra fun lilo OFFSET ati LIMIT ninu awọn ibeere ti a ti pagin

Awọn ọjọ ti lọ nigbati o ko ni lati ṣe aniyan nipa mimuṣe iṣẹ ṣiṣe data silẹ. Akoko ko duro jẹ. Gbogbo olutaja imọ-ẹrọ tuntun fẹ lati ṣẹda Facebook atẹle, lakoko ti o n gbiyanju lati gba gbogbo data ti wọn le gba ọwọ wọn. Awọn iṣowo nilo data yii si awọn awoṣe ikẹkọ ti o dara julọ ti o ṣe iranlọwọ fun wọn lati ni owo. Ni iru awọn ipo bẹẹ, awọn pirogirama nilo lati ṣẹda awọn API ti o gba wọn laaye lati yara ati ni igbẹkẹle ṣiṣẹ pẹlu awọn oye nla ti alaye.

Yẹra fun lilo OFFSET ati LIMIT ninu awọn ibeere ti a ti pagin

Ti o ba ti n ṣe apẹrẹ ohun elo tabi awọn ẹhin data data fun eyikeyi gigun akoko, o ti ṣee kọ koodu lati ṣiṣe awọn ibeere paginated. Fun apẹẹrẹ, bii eyi:

SELECT * FROM table_name LIMIT 10 OFFSET 40

Bawo ni o ṣe ri?

Ṣugbọn ti o ba jẹ bi o ṣe ṣe pagination rẹ, Ma binu lati sọ pe o ko ṣe ni ọna ti o munadoko julọ.

Ṣe o fẹ lati tako si mi? O le kii ṣe nawo время. Ọlẹ, Shopify и Mixmax Wọn ti nlo awọn ilana ti Mo fẹ lati sọrọ nipa loni.

Darukọ o kere ju olupilẹṣẹ ẹhin kan ti ko lo rara OFFSET и LIMIT lati ṣe awọn ibeere paginated. Ni MVP (Ọja ti o le yanju) ati ni awọn iṣẹ akanṣe nibiti a ti lo awọn oye kekere ti data, ọna yii wulo pupọ. O “ṣiṣẹ nikan,” bẹ lati sọrọ.

Ṣugbọn ti o ba nilo lati ṣẹda awọn ọna ṣiṣe ti o gbẹkẹle ati lilo daradara lati ibere, o yẹ ki o ṣe akiyesi ilosiwaju nipa ṣiṣe ti ibeere awọn apoti isura data ti a lo ninu iru awọn ọna ṣiṣe.

Loni a yoo sọrọ nipa awọn iṣoro pẹlu lilo igbagbogbo (buru ju) awọn imuse ti awọn ẹrọ ibeere paginated, ati bii o ṣe le ṣaṣeyọri iṣẹ giga nigba ṣiṣe iru awọn ibeere bẹẹ.

Kini aṣiṣe pẹlu OFFSET ati LIMIT?

Gẹgẹbi a ti sọ tẹlẹ, OFFSET и LIMIT Wọn ṣe daradara ni awọn iṣẹ akanṣe ti ko nilo lati ṣiṣẹ pẹlu awọn oye nla ti data.

Iṣoro naa dide nigbati data data ba dagba si iru iwọn ti ko baamu ni iranti olupin mọ. Sibẹsibẹ, nigbati o ba n ṣiṣẹ pẹlu ibi ipamọ data yii, o nilo lati lo awọn ibeere paginated.

Fun iṣoro yii lati ṣafihan ararẹ, ipo gbọdọ wa ninu eyiti DBMS n lọ si iṣẹ ṣiṣe ọlọjẹ kikun Tabili ti ko ni agbara lori ibeere paginated kọọkan (lakoko ti fifi sii ati awọn iṣẹ piparẹ le waye, ati pe a ko nilo data ti igba atijọ!).

Kini “sọwo tabili ni kikun” (tabi “iṣayẹwo tabili lẹsẹsẹ”, Scan Sequential)? Eyi jẹ iṣẹ lakoko eyiti DBMS leralera ka ori ila kọọkan ti tabili, iyẹn ni, data ti o wa ninu rẹ, ati ṣayẹwo wọn fun ibamu pẹlu ipo ti a fun. Iru ayẹwo tabili yii ni a mọ lati jẹ o lọra julọ. Otitọ ni pe nigba ti o ba ti ṣiṣẹ, ọpọlọpọ awọn iṣẹ titẹ sii / o wu ni a ṣe ti o kan eto disiki olupin naa. Ipo naa jẹ ki o buru si nipasẹ lairi ti o ni nkan ṣe pẹlu ṣiṣẹ pẹlu data ti o fipamọ sori awọn disiki, ati otitọ pe gbigbe data lati disiki si iranti jẹ iṣẹ ṣiṣe to lekoko.

Fun apẹẹrẹ, o ni awọn igbasilẹ ti awọn olumulo 100000000 ati pe o ṣiṣẹ ibeere kan pẹlu ikole OFFSET 50000000. Eyi tumọ si pe DBMS yoo ni lati ṣaja gbogbo awọn igbasilẹ wọnyi (ati pe a ko nilo wọn paapaa!), Fi wọn sinu iranti, ati lẹhin iyẹn mu, sọ, awọn abajade 20 royin ninu LIMIT.

Jẹ ki a sọ pe o le dabi eyi: "yan awọn ori ila lati 50000 si 50020 lati 100000". Iyẹn ni, eto naa yoo nilo akọkọ lati ṣajọpọ awọn ori ila 50000 lati pari ibeere naa. Ṣe o rii iye iṣẹ ti ko wulo ti yoo ni lati ṣe?

Ti o ko ba gbagbọ mi, wo apẹẹrẹ ti Mo ṣẹda nipa lilo awọn ẹya db-fiddle.com

Yẹra fun lilo OFFSET ati LIMIT ninu awọn ibeere ti a ti pagin
Apẹẹrẹ ni db-fiddle.com

Nibẹ, ni apa osi, ni aaye Schema SQL, koodu wa ti o fi awọn ori ila 100000 sinu aaye data, ati ni apa ọtun, ni aaye Query SQL, awọn ibeere meji ti han. Ni akọkọ, ti o lọra, dabi eyi:

SELECT *
FROM `docs`
LIMIT 10 OFFSET 85000;

Ati keji, eyiti o jẹ ojutu ti o munadoko si iṣoro kanna, jẹ bii eyi:

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

Lati le mu awọn ibeere wọnyi ṣẹ, kan tẹ bọtini naa Run ni oke ti oju-iwe naa. Lẹhin ti o ti ṣe eyi, a ṣe afiwe alaye nipa akoko ipaniyan ibeere naa. O wa ni jade pe ṣiṣe ibeere ti ko wulo gba o kere ju awọn akoko 30 to gun ju ṣiṣe ọkan lọ (akoko yii yatọ lati ṣiṣe lati ṣiṣẹ; fun apẹẹrẹ, eto naa le jabo pe ibeere akọkọ mu 37 ms lati pari, ṣugbọn ipaniyan ti keji - 1 ms).

Ati pe ti data ba wa diẹ sii, lẹhinna ohun gbogbo yoo buru paapaa (lati ni idaniloju eyi, wo mi apẹẹrẹ pẹlu 10 million awọn ori ila).

Ohun ti a ti jiroro tẹlẹ yẹ ki o fun ọ ni oye diẹ si bii awọn ibeere data data ṣe ni ilọsiwaju nitootọ.

Jọwọ ṣe akiyesi pe iye ti o ga julọ OFFSET - gun ibeere naa yoo gba lati pari.

Kini MO yẹ ki n lo dipo apapọ OFFSET ati LIMIT?

Dipo apapo OFFSET и LIMIT O tọ lati lo eto ti a ṣe ni ibamu si ero atẹle:

SELECT * FROM table_name WHERE id > 10 LIMIT 20

Eyi jẹ ipaniyan ibeere pẹlu pagination orisun kọsọ.

Dipo fifipamọ awọn lọwọlọwọ ni agbegbe OFFSET и LIMIT ati gbejade wọn pẹlu ibeere kọọkan, o nilo lati tọju bọtini akọkọ ti o gba kẹhin (nigbagbogbo eyi ni ID) ati LIMIT, bi abajade, awọn ibeere ti o jọra si ti o wa loke yoo gba.

Kí nìdí? Koko-ọrọ naa ni pe nipa sisọ idamo ti ọna kika to kẹhin, o sọ fun DBMS rẹ nibiti o nilo lati bẹrẹ wiwa fun data pataki. Pẹlupẹlu, wiwa, ọpẹ si lilo bọtini, yoo ṣee ṣe daradara;

Jẹ ki ká wo ni awọn wọnyi išẹ lafiwe ti awọn orisirisi ibeere. Eyi ni ibeere ti ko ni doko.

Yẹra fun lilo OFFSET ati LIMIT ninu awọn ibeere ti a ti pagin
Ibere ​​​​lọra

Ati pe eyi jẹ ẹya iṣapeye ti ibeere yii.

Yẹra fun lilo OFFSET ati LIMIT ninu awọn ibeere ti a ti pagin
Ibere ​​ibere

Awọn ibeere mejeeji pada deede iye data kanna. Ṣugbọn akọkọ gba iṣẹju-aaya 12,80 lati pari, ati ekeji gba iṣẹju 0,01. Ṣe o lero iyatọ naa?

Awọn iṣoro ti o le ṣee ṣe

Fun ọna ibeere ti a dabaa lati ṣiṣẹ ni imunadoko, tabili gbọdọ ni ọwọn kan (tabi awọn ọwọn) ti o ni alailẹgbẹ ninu, awọn atọka lẹsẹsẹ, gẹgẹbi idanimọ odidi kan. Ni diẹ ninu awọn ọran kan pato, eyi le pinnu aṣeyọri ti lilo iru awọn ibeere lati mu iyara ṣiṣẹ pẹlu data data pọ si.

Nipa ti, nigbati o ba n kọ awọn ibeere, o nilo lati ṣe akiyesi faaji pato ti awọn tabili ki o yan awọn ọna ṣiṣe ti yoo ṣiṣẹ dara julọ lori awọn tabili ti o wa tẹlẹ. Fun apẹẹrẹ, ti o ba nilo lati ṣiṣẹ ni awọn ibeere pẹlu awọn iwọn nla ti data ti o ni ibatan, o le rii pe o nifẹ eyi article.

Ti a ba dojuko iṣoro ti sisọnu bọtini akọkọ, fun apẹẹrẹ, ti a ba ni tabili pẹlu ọpọlọpọ-si-ọpọlọpọ ibasepo, lẹhinna ọna ibile ti lilo OFFSET и LIMIT, ti wa ni ẹri lati ba wa. Ṣugbọn lilo rẹ le ja si awọn ibeere ti o lọra. Ni iru awọn iṣẹlẹ bẹẹ, Emi yoo ṣeduro lilo bọtini akọkọ ti n pọ si laifọwọyi, paapaa ti o ba nilo nikan lati mu awọn ibeere paginated.

Ti o ba nifẹ si koko-ọrọ yii - wo o, wo o и wo o - ọpọlọpọ awọn ohun elo to wulo.

Awọn esi

Ipari akọkọ ti a le fa ni pe, laibikita iwọn awọn data data ti a n sọrọ nipa rẹ, o jẹ dandan nigbagbogbo lati ṣe itupalẹ iyara ti ipaniyan ibeere. Lasiko yi, awọn scalability ti awọn solusan jẹ lalailopinpin pataki, ati ti o ba ti ohun gbogbo ti wa ni apẹrẹ ti tọ lati ibere pepe ti sise lori kan awọn eto, yi, ni ojo iwaju, le fi awọn Olùgbéejáde lati ọpọlọpọ awọn isoro.

Bawo ni o ṣe ṣe itupalẹ ati mu awọn ibeere aaye data pọ si?

Yẹra fun lilo OFFSET ati LIMIT ninu awọn ibeere ti a ti pagin

orisun: www.habr.com

Fi ọrọìwòye kun