MySQL LIMIT & OFFSET esimerkein
โก รlykรคs yhteenveto
MySQL LIMIT-avainsana rajoittaa kyselyn palauttamien rivien mรครคrรครค, ja OFFSET-arvo mรครคrittรครค, miltรค riviltรค tulos alkaa. Yhdessรค ne pitรคvรคt tulosjoukot pieninรค, nopeuttavat sivujen latautumista ja tehostavat tietuekohtaista sivutusta.

Mikรค on LIMIT-avainsana kohdassa MySQL?
RAJOITA avainsana rajoittaa kyselytuloksessa palautettavien rivien mรครคrรครค. Sitรค voidaan kรคyttรครค SELECT-, UPDATE- ja DELETE-lausekkeiden kanssa, joten se rajaa kyselyn lukemat rivit sekรค rivit, joihin kirjoitus vaikuttaa.
LIMIT-avainsanan syntaksi on seuraava.
SELECT {fieldname(s) | *} FROM tableName(s) [WHERE condition] LIMIT N;
TรรLTร
- "VALITSE {kentรคnnimi(t) | *} FROM tableName(s)โ on SELECT-lause jotka sisรคltรคvรคt kentรคt, jotka haluamme palauttaa kyselyssรคmme.
- "[WHERE ehto]" on valinnainen, mutta kun se annetaan, se mรครคrittรครค suodattimen tulosjoukolle. WHERE-lauseke kรคytetรครคn ennen LIMIT-arvoa, joten suodatus tapahtuu ensin ja rajaus kohdistuu vain siihen, mikรค sรคilyy.
- โRAJA Nโ on avainsana, ja N on mikรค tahansa luku, joka alkaa nollasta. Jos rajaksi asetetaan 0, ei tietueita ole lainkaan. Jos taulukossa on vรคhemmรคn tietueita kuin N, ne kaikki palautetaan eikรค virhettรค synny.
Syntaksi on lyhyt, mutta syy sen olemassaoloon on syytรค mainita ennen esimerkkejรค.
Miksi meidรคn pitรคisi kรคyttรครค LIMIT-avainsanaa?
Oletetaan, ettรค olemme kehittymรคssรคping myflixdb-tietokannan pรครคllรค toimiva sovellus. Jรคrjestelmรคn suunnittelijat ovat pyytรคneet meitรค rajoittamaan sivulla nรคytettรคvien tietueiden mรครคrรคn 20 tietueeseen hidasten latausaikojen estรคmiseksi. Miten toteutamme jรคrjestelmรคn, joka tรคyttรครค tรคmรคn vaatimuksen?
LIMIT-avainsana kรคsittelee juuri tรคtรค tilannetta. Sen sijaan, ettรค jokainen jรคsenrivi vedettรคisiin sovellukseen ja useimmat hylรคttรคisiin, kysely palauttaa 20 tietuetta sivua kohden ja tietokanta tekee tyรถn. Tรคstรค seuraa kolme etua.
- Nopeampi vastaus: Levyltรค luetaan vรคhemmรคn dataa ja verkossa kulkee vรคhemmรคn dataa.
- Pienempi muistin kรคyttรถ: Sovellus sรคilyttรครค yhden sivun rivejรค, ei koko taulukkoa.
- Turvailija kirjoittaa: RAJA PรIVITYKSELLE tai POISTA lauseke rajoittaa kuinka monta riviรค virhe voi koskea.
MySQL LIMIT-kyselyesimerkkejรค
Alla olevat esimerkit suorittavat myflixdb-tietokannan members-taulukkoa. Ensimmรคinen palauttaa kaksi riviรค eikรค mitรครคn muuta.
SELECT * FROM members LIMIT 2;
| jรคsennumero | tรคydet_ nimet | sukupuoli | syntymรคaika | rekisterรถintipรคivรคmรครคrรค | fyysinen osoite | postiosoite | yhteystiedot | luottokortin numero | |
|---|---|---|---|---|---|---|---|---|---|
| 1 | Janet Jones | Nainen | 21-07-1980 | NULL | First Street -tontti nro 4 | Yksityinen laukku | 0759 253 542 | janetjones@yagoo.cm | NULL |
| 2 | Janet Smith Jones | Nainen | 23-06-1980 | NULL | Melrose 123 | NULL | NULL | jj@fstreet.com | NULL |
Kuten yllรค olevasta tuloksesta kรคy ilmi, vain kaksi jรคsentรค on palautettu.
Kymmenen (10) jรคsenen listan hakeminen tietokannasta
Oletetaan, ettรค haluamme listan kymmenestรค ensimmรคisestรค rekisterรถityneestรค jรคsenestรค Myflixin tietokannasta. Alla oleva skripti pyytรครค heitรค.
SELECT * FROM members LIMIT 10;
Skriptin suorittaminen antaa alla olevan tuloksen.
| jรคsennumero | tรคydet_ nimet | sukupuoli | syntymรคaika | rekisterรถintipรคivรคmรครคrรค | fyysinen osoite | postiosoite | yhteystiedot | luottokortin numero | |
|---|---|---|---|---|---|---|---|---|---|
| 1 | Janet Jones | Nainen | 21-07-1980 | NULL | First Street -tontti nro 4 | Yksityinen laukku | 0759 253 542 | janetjones@yagoo.cm | NULL |
| 2 | Janet Smith Jones | Nainen | 23-06-1980 | NULL | Melrose 123 | NULL | NULL | jj@fstreet.com | NULL |
| 3 | Robert Phil | Mies | 12-07-1989 | NULL | 3rd Street 34 | NULL | 12345 | rm@tstreet.com | NULL |
| 4 | Gloria Williams | Nainen | 14-02-1984 | NULL | 2nd Street 23 | NULL | NULL | NULL | NULL |
| 5 | Leonard Hofstadter | Mies | NULL | NULL | Woodcrest | NULL | 845738767 | NULL | NULL |
| 6 | Sheldon Cooper | Mies | NULL | NULL | Woodcrest | NULL | 976736763 | NULL | NULL |
| 7 | Rajesh Koothrappali | Mies | NULL | NULL | Woodcrest | NULL | 938867763 | NULL | NULL |
| 8 | Leslie Winkle | Mies | 14-02-1984 | NULL | Woodcrest | NULL | 987636553 | NULL | NULL |
| 9 | Howard Wolowitz | Mies | 24-08-1981 | NULL | Etelรคpuisto | PO Box 4563 | 987786553 | lwolowitz[at]email.me | NULL |
Vain 9 jรคsentรค on palautettu, koska LIMIT-lausekkeen N on suurempi kuin taulukon tietueiden lukumรครคrรค. 9 rivin pyytรคminen tuottaa eksplisiittisesti saman tulosjoukon.
SELECT * FROM members LIMIT 9;
๐ก Vinkki: LIMIT valitsee rivit palvelimen tuottamasta jรคrjestyksestรค. Lisรครค TILAUS lauseketta aina, kun rivien identiteetillรค on merkitystรค, muuten ei ole taattua, ettรค "ensimmรคiset 10 jรคsentรค" tarkoittavat samoja yhdeksรครค henkilรถรค kahdesti.
Rivien mรครคrรคn rajoittaminen on ominaisuuden ensimmรคinen puolisko. Ikkunan aloituskohdan valitseminen on toinen puolisko.
OFFSET-arvon kรคyttรคminen LIMIT-kyselyssรค
OFFSET arvoa kรคytetรครคn useimmiten yhdessรค LIMIT-avainsanan kanssa. Se mรครคrittรครค, miltรค riviltรค palvelin alkaa hakea tietoja, joten sitรค edeltรคvรคt rivit ohitetaan.
Oletetaan, ettรค haluamme rajoitetun mรครคrรคn jรคseniรค alkaen taulukon keskeltรค. Alla oleva skripti alkaa toiselta riviltรค ja rajoittaa tuloksen kahteen tietueeseen.
SELECT * FROM `members` LIMIT 1, 2;
Suorittamalla sen sisรครคn MySQL Tyรถpรถytรค myflixdb:tรค vastaan โโantaa seuraavan tuloksen.
| jรคsennumero | tรคydet_ nimet | sukupuoli | syntymรคaika | rekisterรถintipรคivรคmรครคrรค | fyysinen osoite | postiosoite | yhteystiedot | luottokortin numero | |
|---|---|---|---|---|---|---|---|---|---|
| 2 | Janet Smith Jones | Nainen | 23-06-1980 | NULL | Melrose 123 | NULL | NULL | jj@fstreet.com | NULL |
| 3 | Robert Phil | Mies | 12-07-1989 | NULL | 3rd Street 34 | NULL | 12345 | rm@tstreet.com | NULL |
Huomaa, ettรค tรคssรค SIIRTYMร = 1, joten rivi #2 on ensimmรคinen palautettu rivi, ja RAJA = 2, joten vain 2 tietuetta tulee takaisin.
Kaksiargumenttisessa muodossa offset kirjoitetaan ensin ja rivien lukumรครคrรค toiseksi, mikรค on helppo peruuttaa vahingossa. MySQL hyvรคksyy myรถs eksplisiittisen muodon, joka poistaa epรคselvyyden, ja sitรค kannattaa kรคyttรครค uudessa koodissa.
SELECT * FROM `members` LIMIT 2 OFFSET 1;
Molemmat lauseet palauttavat samat kaksi riviรค. Kun offset ymmรคrretรครคn, sivutuskuvio, johon jokainen listausnรคyttรถ perustuu, putoaa siitรค suoraan pois.
Kyselytulosten sivuttaminen LIMIT- ja OFFSET-operaattorien avulla
Sivutus jakaa suuren tulosjoukon numeroituihin sivuihin, ja LIMIT yhdessรค OFFSETin kanssa on mekanismi, joka tekee tรคmรคn. Jokaista sivupyyntรถรค ohjaa kaksi arvoa: sivun koko, joka kertoo, kuinka monta tietuetta nรคkyy yhdellรค nรคytรถllรค, ja kรคyttรคjรคn pyytรคmรค sivunumero.
Offset johdetaan niistรค yhdellรค kaavalla.
-- OFFSET = page_size * (page_number - 1) SELECT membership_number, full_names FROM members ORDER BY membership_number ASC LIMIT 20 OFFSET 0; -- page 1
Sivulla 2 rajoitus pysyy samana ja siirtymรครค siirretรครคn yhden sivukoon verran eteenpรคin.
SELECT membership_number, full_names FROM members ORDER BY membership_number ASC LIMIT 20 OFFSET 20; -- page 2
Kolme sรครคntรถรค pitรครค sivutetun listauksen oikeina ja nopeasti.
- Lajittele aina: Sivutettu kysely ilman ORDER BY -metodia voi nรคyttรครค saman tietueen kahdella eri sivulla ja piilottaa toisen kokonaan, koska palvelin voi muuttaa rivien jรคrjestystรค kutsujen vรคlillรค.
- Lajittele yksilรถllisen sarakkeen mukaan: Lajittelusarakkeen tasapisteet jรคttรคvรคt tasapisteiden rivien jรคrjestyksen mรครคrittelemรคttรถmรคksi. Lajittelu perusavaimen mukaan tai sen lisรครคminen tasapisteiden ratkaisemiseksi poistaa ongelman.
- Katso syvรคsivuja: SIIRTO 100 000 voimaa MySQL lukea satatuhatta riviรค ja heittรครค ne pois ennen seuraavien kahdenkymmenen palauttamista. Vastausaika kasvaa sivunumeron mukana.
Hyvin syvรครค sivutusta varten avainjoukkojen sivutus vรคlttรครค siirtymรคn kokonaan. Ohitettavien rivien laskemisen sijaan kysely muistaa edellisen sivun viimeisen avaimen ja kysyy sen jรคlkeisiรค rivejรค.
SELECT membership_number, full_names FROM members WHERE membership_number > 20 -- last id from the previous page ORDER BY membership_number ASC LIMIT 20;
Tรคmรค muoto pysyy nopeana millรค tahansa syvyydellรค, koska indeksi hyppรครค suoraan aloitusnรคppรคimeen sen sijaan, ettรค kรคvelisi edeltรคvien rivien lรคpi. Kompromissi on, ettรค sivut on kรคveltรคvรค perรคkkรคin, joten hyppรครคping suoraan sivulle 500 ei ole enรครค mahdollista.
LIMIT sisรครคn MySQL vs. TOP ja FETCH FIRST
LIMIT ei ole osa jokaista SQL-dialektia, millรค on merkitystรค heti, kun kyselyn on siirryttรคvรค tietokantamoottorien vรคlillรค. MySQL, PostgreSQLja SQLite jaa LIMIT-avainsana. SQL Server kรคyttรครค TOP-avainsanaa ja Oracle kรคyttรครค standardia FETCH FIRST -lauseketta. Alla olevassa taulukossa vertaillaan nรคitรค kolmea.
| lauseke | Moottori | esimerkki | Ohittaa rivejรค |
|---|---|---|---|
| RAJA โฆ SIIRTYMร | MySQL, PostgreSQL, SQLite | SELECT * FROM jรคsenet RAJA 20 OFFSET 40; | Kyllรค, OFFSET-toiminnolla |
| TOP | SQL Server | VALITSE TOP 20 * JรSENISTร; | Ei, OFFSET โฆ FETCH vaaditaan |
| HAE ENSIN | Oracle, Db2, vakiomuotoinen SQL | VALITSE * JรSENILTร HAKEE VAIN ENSIMMรISET 20 RIVIร; | Kyllรค, OFFSET-toiminnolla โฆ ROWS |
Toiminta on sama jokaisessa tapauksessa: rivien mรครคrรค rajoitetaan ja halutessaan ensin ohitetaan tietty mรครคrรค rivejรค. Vain kirjoitusasu muuttuu. Kyselyn, jonka on suoritettava useammalla kuin yhdellรค hakukoneella, tulisi siksi eristรครค rivirajoituslauseke sen sijaan, ettรค se hajaantuisi koodikantaan.
