MySQL LIMIT & OFFSET med eksempler

โšก Smart oppsummering

Ocuco MySQL Nรธkkelordet LIMIT begrenser hvor mange rader en spรธrring returnerer, og OFFSET-verdien bestemmer hvilken rad resultatet starter fra. Sammen holder de resultatsettene smรฅ, sรธrger for at sider lastes inn raskt og driver paginering post-for-post.

  • ๐Ÿ”ข Kjerneoppfรธrsel: LIMIT N returnerer maksimalt N rader. En tabell som inneholder fรฆrre rader enn N returnerer alle radene uten feil.
  • 0๏ธโƒฃ Null tilfelle: LIMIT 0 returnerer ingen rader, noe som gjรธr det til en billig mรฅte รฅ inspisere kolonnemetadata pรฅ.
  • ๐Ÿ“ Offset-syntaks: LIMIT 1, 2 hopper over รฉn rad og returnerer to, sรฅ forskyvningen skrives fรธrst og radantallet deretter.
  • ๐Ÿ“„ Pagineringsformel: OFFSET er lik sidestรธrrelse multiplisert med sidetall minus รฉn, som gjรธr et resultatsett om til nummererte sider.
  • โ†•๏ธ Ordreavhengighet: Uten BESTILLING AV, MySQL kan returnere forskjellige rader pรฅ hver kjรธring, sรฅ LIMIT er bare deterministisk med en eksplisitt sortering.
  • โš™๏ธ Stรธtte for uttalelser: LIMIT setter ogsรฅ en grense for radene som pรฅvirkes av UPDATE og DELETE, og beskytter dermed en stor tabell mot ubegrenset skriving.
  • ???? Ytelsesadvarsel: En stor forskyvning gjรธr MySQL les og forkast hver utelatte rad, slik at dype sider vokser saktere.

MySQL GRENSE og FORSKYVNING

Hva er LIMIT-nรธkkelordet i MySQL?

Ocuco BEGRENSE Nรธkkelordet begrenser antall rader som returneres i et spรธrreresultat. Det kan brukes med SELECT-, UPDATE- og DELETE-setningene, slik at det begrenser antall rader en spรธrring leser, samt antall rader en skriving pรฅvirker.

Syntaksen for LIMIT-nรธkkelordet er som fรธlger.

SELECT {fieldname(s) | *} FROM tableName(s) [WHERE condition] LIMIT N;

HER

  • "VELG {feltnavn(e) | *} FRA tabellnavn(e)" er den SELECT-setning som inneholder feltene vi รธnsker รฅ returnere i sรธket vรฅrt.
  • ยซ[WHERE-tilstand]ยป er valgfritt, men nรฅr det oppgis, spesifiserer det et filter pรฅ resultatsettet. HVOR klausul brukes fรธr LIMIT, sรฅ filtrering skjer fรธrst og grensen brukes pรฅ det som overlever.
  • ยซGRENSE Nยป er nรธkkelordet, og N er et hvilket som helst tall som starter fra 0. Hvis du setter 0 som grense, returneres ingen poster i det hele tatt. Hvis du setter et tall som 5, returneres fem poster. Hvis tabellen inneholder fรฆrre poster enn N, returneres alle, og det oppstรฅr ingen feil.

Syntaksen er kort, men grunnen til at den eksisterer er verdt รฅ nevne fรธr eksemplene.

Hvorfor bรธr vi bruke LIMIT-nรธkkelordet?

Anta at vi er utvikledeping applikasjonen som kjรธrer oppรฅ myflixdb. Systemdesignerne har bedt oss om รฅ begrense antall poster som vises pรฅ en side til 20 poster for รฅ motvirke treg lastetid. Hvordan implementerer vi et system som oppfyller et slikt krav?

Nรธkkelordet LIMIT hรฅndterer akkurat denne situasjonen. I stedet for รฅ hente hver medlemsrad inn i applikasjonen og forkaste de fleste av dem, returnerer spรธrringen 20 poster per side, og databasen gjรธr jobben. Tre fordeler fรธlger av det.

  • Raskere respons: mindre data leses fra disken og mindre data krysser nettverket.
  • Lavere minnebruk: Applikasjonen inneholder รฉn side med rader, ikke hele tabellen.
  • Safer skriver: en GRENSE pรฅ en OPPDATERING eller en SLETT Utsagnet setter en grense for hvor mange rader en feil kan berรธre.

MySQL LIMIT-spรธrreeksempler

Eksemplene nedenfor kjรธrer mot medlemstabellen i myflixdb-databasen. Det fรธrste returnerer to rader og ingenting mer.

SELECT * FROM members LIMIT 2;
medlemsnummer fulle_ navn kjรธnn fรธdselsdato registreringsdato fysisk_ adresse postadresse kontaktnummer emalje kredittkortnummer
1 Janet Jones Hunn 21-07-1980 NULL First Street tomt nr. 4 Privat bag 0759 253 542 janetjones@yagoo.cm NULL
2 Janet Smith Jones Hunn 23-06-1980 NULL Melrose 123 NULL NULL jj@fstreet.com NULL

Som resultatet ovenfor viser, har bare to medlemmer blitt returnert.

Hente en liste med ti (10) medlemmer fra databasen

Anta at vi รธnsker en liste over de fรธrste 10 registrerte medlemmene fra Myflix-databasen. Skriptet nedenfor ber om dem.

SELECT * FROM members LIMIT 10;

ร… kjรธre skriptet gir resultatet som vises nedenfor.

medlemsnummer fulle_ navn kjรธnn fรธdselsdato registreringsdato fysisk_ adresse postadresse kontaktnummer emalje kredittkortnummer
1 Janet Jones Hunn 21-07-1980 NULL First Street tomt nr. 4 Privat bag 0759 253 542 janetjones@yagoo.cm NULL
2 Janet Smith Jones Hunn 23-06-1980 NULL Melrose 123 NULL NULL jj@fstreet.com NULL
3 Robert Phil mann 12-07-1989 NULL 3rd Street 34 NULL 12345 rm@tstreet.com NULL
4 Gloria Williams Hunn 14-02-1984 NULL 2nd Street 23 NULL NULL NULL NULL
5 Leonard Hofstadter mann NULL NULL Woodcrest NULL 845738767 NULL NULL
6 Sheldon Cooper mann NULL NULL Woodcrest NULL 976736763 NULL NULL
7 Rajesh Koothrappali mann NULL NULL Woodcrest NULL 938867763 NULL NULL
8 Leslie Winkle mann 14-02-1984 NULL Woodcrest NULL 987636553 NULL NULL
9 Howard Wolowitz mann 24-08-1981 NULL Sรธr Park PO Box 4563 987786553 lwolowitz[at]email.me NULL

Bare 9 medlemmer er returnert, fordi N i LIMIT-klausulen er stรธrre enn antall poster i tabellen. ร… spรธrre etter 9 rader gir eksplisitt det samme resultatsettet.

SELECT * FROM members LIMIT 9;

๐Ÿ’ก Tips: LIMIT velger rader fra den rekkefรธlgen serveren tilfeldigvis produserer. Legg til en REKKEFร˜LGE ETTER klausulen nรฅr identiteten til radene har betydning, ellers er det ikke garantert at ยซde fรธrste 10 medlemmeneยป betyr de samme ni personene to ganger.

ร… begrense radantallet er den fรธrste halvdelen av funksjonen. ร… velge hvor vinduet starter er den andre.

Bruk av OFFSET-verdien i LIMIT-spรธrringen

Ocuco OFFSET `value` brukes oftest sammen med LIMIT-nรธkkelordet. Det angir hvilken rad serveren begynner รฅ hente data fra, sรฅ rader fรธr det punktet hoppes over.

Anta at vi รธnsker et begrenset antall medlemmer som starter fra midten av tabellen. Skriptet nedenfor starter pรฅ andre rad og begrenser resultatet til to poster.

SELECT * FROM `members` LIMIT 1, 2;

Utfรธrer det i MySQL Workbench mot myflixdb gir fรธlgende resultat.

medlemsnummer fulle_ navn kjรธnn fรธdselsdato registreringsdato fysisk_ adresse postadresse kontaktnummer emalje kredittkortnummer
2 Janet Smith Jones Hunn 23-06-1980 NULL Melrose 123 NULL NULL jj@fstreet.com NULL
3 Robert Phil mann 12-07-1989 NULL 3rd Street 34 NULL 12345 rm@tstreet.com NULL

Merk at her FORSKYVNING = 1, derfor er rad nr. 2 den fรธrste raden som returneres, og GRENSE = 2, derfor kommer bare 2 poster tilbake.

I formen med to argumenter skrives forskyvningen fรธrst og radantall deretter, noe som er lett รฅ reversere ved et uhell. MySQL aksepterer ogsรฅ en eksplisitt form som fjerner tvetydigheten, og det er den som foretrekkes i ny kode.

SELECT * FROM `members` LIMIT 2 OFFSET 1;

Begge setningene returnerer de samme to radene. Nรฅr offset-en er forstรฅtt, faller pagineringsmรธnsteret som alle oppfรธringsskjermer er avhengige av, direkte ut av den.

Slik paginererer du sรธkeresultater med LIMIT og OFFSET

Paginering deler et stort resultatsett inn i nummererte sider, og LIMIT sammen med OFFSET er mekanismen som gjรธr det. To verdier styrer hver sideforespรธrsel: sidestรธrrelsen, som er hvor mange poster som vises pรฅ รฉn skjerm, og sidetallet som forespurt av brukeren.

Offsetet er avledet fra dem med en enkelt formel.

-- OFFSET = page_size * (page_number - 1)
SELECT membership_number, full_names
FROM members
ORDER BY membership_number ASC
LIMIT 20 OFFSET 0;   -- page 1

Side 2 beholder samme grense og flytter forskyvningen fremover med รฉn sidestรธrrelse.

SELECT membership_number, full_names
FROM members
ORDER BY membership_number ASC
LIMIT 20 OFFSET 20;  -- page 2

Tre regler sรธrger for at en paginert liste er korrekt og rask.

  1. Sorter alltid: En paginert spรธrring uten ORDER BY kan vise den samme posten pรฅ to forskjellige sider og skjule en annen helt, fordi serveren stรฅr fritt til รฅ endre radrekkefรธlgen mellom kall.
  2. Sorter pรฅ en unik kolonne: Uavgjorte rader i sorteringskolonnen lar rekkefรธlgen pรฅ de uavgjorte radene vรฆre udefinert. ร… sortere pรฅ primรฆrnรธkkelen, eller legge den til som en uavgjort, fjerner problemet.
  3. Se dype sider: FORSKYVNING 100 000 krefter MySQL รฅ lese hundre tusen rader og kaste dem fรธr man returnerer de neste tjue. Svartiden รธker med sidetallet.

For svรฆrt dyp paginering unngรฅr nรธkkelsett-paginering forskyvningen fullstendig. I stedet for รฅ telle rader som skal hoppes over, husker spรธrringen den siste nรธkkelen fra forrige side og spรธr etter radene etter den.

SELECT membership_number, full_names
FROM members
WHERE membership_number > 20      -- last id from the previous page
ORDER BY membership_number ASC
LIMIT 20;

Denne formen holder seg rask uansett dybde, fordi indeksen hopper rett til starttasten i stedet for รฅ gรฅ gjennom radene foran den. Ulempen er at sider mรฅ gรฅs i rekkefรธlge, sรฅ hoppping Det er ikke lenger mulig รฅ gรฅ direkte til side 500.

LIMIT i MySQL vs. TOPP og HENT Fร˜RST

LIMIT er ikke en del av alle SQL-dialekter, noe som er viktig sรฅ snart en spรธrring mรฅ flyttes mellom databasemotorer. MySQL, PostgreSQLog SQLite del LIMIT-nรธkkelordet. SQL Server bruker TOP, og Oracle bruker standard FETCH FIRST-klausulen. Tabellen nedenfor sammenligner de tre.

Klausul Motor Eksempel Hopper over rader
GRENSE โ€ฆ FORSKYVNING MySQL, PostgreSQL, SQLite VELG * FRA medlemmer GRENSE 20 FORSKYVNING 40; Ja, med FORSKYVNING
TOPP SQL Server VELG TOPP 20 * FRA medlemmer; Nei, OFFSET โ€ฆ FETCH er pรฅkrevd
HENT Fร˜RST Oracle, Db2, standard SQL VELG * FRA medlemmer HENT KUN DE Fร˜RSTE 20 RADENE; Ja, med FORSKYVNING โ€ฆ RADER

Oppfรธrselen er den samme i begge tilfeller: sett en grense for antall rader og hopp eventuelt over et antall rader fรธrst. Bare stavemรฅten endres. En spรธrring som mรฅ kjรธre pรฅ mer enn รฉn motor, bรธr derfor isolere radbegrensningsklausulen i stedet for รฅ spre den gjennom kodebasen.

Spรธrsmรฅl og svar

Ja. Begge godtar et vanlig radtall, for eksempel SLETT FRA medlemmer GRENSE 10. Offset-formen med to argumenter er ikke tillatt der, sรฅ bare antallet berรธrte rader kan begrenses.

Offset teller fra null, sรฅ OFFSET 0 starter pรฅ den fรธrste raden og OFFSET 1 starter pรฅ den andre. Selve radantallet er en vanlig stรธrrelse og leses som et normalt tall.

Kjรธr en separat SELECT COUNT(*) med samme WHERE-klausul, men uten LIMIT. Antallet forteller applikasjonen hvor mange sider som finnes, mens limited-spรธrringen returnerer radene for gjeldende side.

Ofte, ja. AI-assistenter inne i klienter som MySQL Workbench Skriv om en OFFSET-spรธrring til en WHERE-klausul pรฅ den sist settte nรธkkelen. Bekreft at sorteringskolonnen er unik og indeksert fรธr du stoler pรฅ omskrivingen.

Fordi den genererte setningen vanligvis utelater ORDER BY. Uten en eksplisitt sortering, MySQL kan returnere radene i hvilken som helst rekkefรธlge, slik at den samme LIMIT kan produsere et annet utvalg pรฅ hver kjรธring. Legg til sorteringen selv.

Oppsummer dette innlegget med: