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.

  • ๐Ÿ”ข Ydinkรคyttรคytyminen: LIMIT N palauttaa enintรครคn N riviรค. Taulukko, jossa on vรคhemmรคn rivejรค kuin N, palauttaa ne kaikki ilman virhettรค.
  • 0๏ธโƒฃ Nolla tapaus: LIMIT 0 ei palauta rivejรค, mikรค tekee siitรค halvan tavan tarkastella sarakemetatietoja.
  • ๐Ÿ“ Offset-syntaksi: LIMIT 1, 2 ohittaa yhden rivin ja palauttaa kaksi, joten siirtymรค kirjoitetaan ensin ja rivien mรครคrรค toiseksi.
  • ๐Ÿ“„ Sivutuskaava: SIIRTYMร„ on sivun koko kerrottuna sivunumerolla miinus yksi, jolloin tulosjoukosta tulee numeroituja sivuja.
  • โ†•๏ธ Tilauksen riippuvuus: Ilman ORDER BY -lauseketta MySQL voi palauttaa eri rivejรค jokaisella ajokerralla, joten LIMIT on deterministinen vain eksplisiittisen lajittelun kanssa.
  • โš™๏ธ Lausunnon tuki: LIMIT-funktio rajoittaa myรถs UPDATE- ja DELETE-komentojen vaikutuspiiriin kuuluvia rivejรค, suojaten suurta taulukkoa rajattomalta kirjoitukselta.
  • ๐Ÿข Suorituskykyรค koskeva varoitus: Suuri siirtymรค tekee MySQL lue ja hylkรครค jokainen ohitettu rivi, jotta syvรคt sivut kasvavat hitaammin.

MySQL RAJA ja OFFSET

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 email 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 email 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 email 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.

  1. 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รค.
  2. 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.
  3. 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.

UKK

Kyllรค. Molemmat hyvรคksyvรคt pelkรคn rivien lukumรครคrรคn, kuten POISTA FROM-jรคsenten RAJA 10. Kahden argumentin offset-muotoa ei sallita, joten vain niiden rivien mรครคrรครค voidaan rajoittaa.

Offset laskee nollasta, joten OFFSET 0 alkaa ensimmรคisestรค rivistรค ja OFFSET 1 toisesta. Rivien lukumรครคrรค itsessรครคn on pelkkรค suure ja luetaan normaalina numerona.

Suorita erillinen SELECT COUNT(*) -kysely samalla WHERE-lausekkeella, mutta ilman LIMIT-lausetta. Count kertoo sovellukselle, kuinka monta sivua on olemassa, kun taas rajoitettu kysely palauttaa nykyisen sivun rivit.

Usein kyllรค. Asiakkaiden sisรคllรค olevat tekoรคlyavustajat, kuten MySQL Tyรถpรถytรค Kirjoita OFFSET-kysely uudelleen WHERE-lausekkeen muotoon viimeksi nรคhdyn avaimen perusteella. Varmista, ettรค lajittelusarake on yksilรถllinen ja indeksoitu, ennen kuin luotat uudelleenkirjoitukseen.

Koska luodusta lausekkeesta yleensรค puuttuu ORDER BY. Ilman eksplisiittistรค lajittelua MySQL voi palauttaa rivit missรค tahansa jรคrjestyksessรค, joten sama LIMIT voi tuottaa eri otoksen jokaisella ajokerralla. Lisรครค lajittelu itse.

Tiivistรค tรคmรค viesti seuraavasti: