MySQL LIMIT & OFFSET példákkal

⚡ Okos összefoglaló

Az MySQL A LIMIT kulcsszó korlátozza, hogy egy lekérdezés hány sort ad vissza, az OFFSET érték pedig azt határozza meg, hogy az eredmény melyik sortól kezdődik. Együttesen kis méretű eredményhalmazokat tartanak, gyorsan betöltik az oldalakat, és rekordonkénti lapozást vezérelnek.

  • 🔢 Alapvető viselkedés: A LIMIT N függvény legfeljebb N sort ad vissza. Egy N-nél kevesebb sort tartalmazó tábla hiba nélkül visszaadja az összes sort.
  • 0️⃣ Nulla eset: A LIMIT 0 nem ad vissza sorokat, ami olcsó módot kínál az oszlopmetaadatok vizsgálatára.
  • 📍 Eltolás szintaxis: A LIMIT 1, 2 egy sort kihagy és kettőt ad vissza, így az eltolás kerül először, a sorok száma pedig másodszor.
  • 📄 Lapozási képlet: Az OFFSET függvény értéke az oldalméret szorozva az oldalszám mínusz eggyel, ami az eredményhalmazt számozott oldalakká alakítja.
  • ↕️ Rendelési függőség: ORDER BY nélkül MySQL minden futtatáskor különböző sorokat adhat vissza, így a LIMIT csak explicit rendezéssel determinisztikus.
  • 🇧🇷 Nyilatkozat támogatása: A LIMIT függvény korlátozza az UPDATE és DELETE által érintett sorokat, így védve a nagyméretű táblákat a korlátlan írástól.
  • ???? Teljesítménybeli figyelmeztetés: A nagy eltolás miatt MySQL minden kihagyott sort elolvas és elveti, így a mélyebb oldalak lassabban nőnek.

MySQL LIMITÁLÁS és ELTOLÁS

Mi a LIMIT kulcsszó a következőben: MySQL?

Az LIMIT A kulcsszó korlátozza a lekérdezés eredményében visszaadott sorok számát. Használható a SELECT, UPDATE és DELETE utasításokkal, így korlátozza a lekérdezés által beolvasott sorok számát, valamint az írás által érintett sorok számát.

A LIMIT kulcsszó szintaxisa a következő.

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

ITT

  • „SELECT {fieldname(s) | *} FROM tableName(s)” a SELECT utasítás amely tartalmazza azokat a mezőket, amelyeket vissza szeretnénk adni a lekérdezésünkben.
  • „[WHERE feltétel]” opcionális, de ha meg van adva, akkor egy szűrőt határoz meg az eredményhalmazon. WHERE záradék a LIMIT előtt kerül alkalmazásra, így a szűrés először megtörténik, és a korlátozás arra vonatkozik, ami túléli.
  • „N HATÁR” a kulcsszó, és N bármely 0-tól kezdődő szám. Ha a 0-t határértékként adjuk meg, akkor egyáltalán nem adunk vissza rekordokat. Ha egy szám, például az 5, öt rekordot ad vissza. Ha a tábla kevesebb rekordot tartalmaz, mint N, akkor az összes rekordot visszaadja, és nem keletkezik hiba.

A szintaxis rövid, de a létezésének okát érdemes megemlíteni a példák előtt.

Miért használjuk a LIMIT kulcsszót?

Tegyük fel, hogy fejlődünkping az alkalmazás, ami a myflixdb felett fut. A rendszertervezők arra kértek minket, hogy korlátozzuk az egy oldalon megjelenített rekordok számát 20 rekordra, hogy ellensúlyozzuk a lassú betöltési időket. Hogyan valósítsunk meg egy olyan rendszert, ami megfelel ennek a követelménynek?

A LIMIT kulcsszó pontosan ezt a helyzetet kezeli. Ahelyett, hogy minden egyes tagsort behívna az alkalmazásba, és a legtöbbjüket elvetné, a lekérdezés oldalanként 20 rekordot ad vissza, és az adatbázis elvégzi a munkát. Ebből három előny származik.

  • Gyorsabb válasz: kevesebb adatot olvasnak be a lemezről, és kevesebb adat halad át a hálózaton.
  • Alacsonyabb memóriahasználat: Az alkalmazás egy oldalnyi sort tárol, nem az egész táblázatot.
  • Safer írja: egy FRISSÍTÉSI LIMIT vagy egy DELETE Az utasítás korlátozza, hogy egy hiba hány sort érinthet.

MySQL LIMIT lekérdezési példák

Az alábbi példák a myflixdb adatbázis members tábláján futnak. Az első két sort ad vissza, semmi többet.

SELECT * FROM members LIMIT 2;
Tagsági szám teljes_ nevek nemek születési_dátum regisztráció_dátuma valódi cím postázási cím elérhetőség email hitelkártyaszám
1 Janet Jones 21-07-1980 NULL 4. számú első utcai telek Privát táska 0759 alkalmazott janetjones@yagoo.cm NULL
2 Janet Smith Jones 23-06-1980 NULL Melrose 123 NULL NULL jj@fstreet.com NULL

Amint a fenti eredmény mutatja, csak két tagot adtak vissza.

Tíz (10) tag listájának lekérése az adatbázisból

Tegyük fel, hogy a Myflix adatbázis első 10 regisztrált tagjának listáját szeretnénk megkapni. Az alábbi szkript bekéri őket.

SELECT * FROM members LIMIT 10;

A szkript futtatása az alább látható eredményt adja.

Tagsági szám teljes_ nevek nemek születési_dátum regisztráció_dátuma valódi cím postázási cím elérhetőség email hitelkártyaszám
1 Janet Jones 21-07-1980 NULL 4. számú első utcai telek Privát táska 0759 alkalmazott janetjones@yagoo.cm NULL
2 Janet Smith Jones 23-06-1980 NULL Melrose 123 NULL NULL jj@fstreet.com NULL
3 Robert Phil férfi 12-07-1989 NULL 3. utca 34 NULL 12345 rm@tstreet.com NULL
4 Gloria Williams 14-02-1984 NULL 2. utca 23 NULL NULL NULL NULL
5 Leonard Hofstadter férfi NULL NULL Woodcrest NULL 845738767 NULL NULL
6 Sheldon Cooper férfi NULL NULL Woodcrest NULL 976736763 NULL NULL
7 Rajesh Koothrappali férfi NULL NULL Woodcrest NULL 938867763 NULL NULL
8 Leslie Winkle férfi 14-02-1984 NULL Woodcrest NULL 987636553 NULL NULL
9 Howard Wolowitz férfi 24-08-1981 NULL Déli Park PO Box 4563 987786553 lwolowitz[kukac]email.me NULL

Csak 9 tagot adott vissza a rendszer, mivel a LIMIT záradékban szereplő N nagyobb, mint a tábla rekordjainak száma. 9 sor megadása explicit módon ugyanazt az eredményhalmazt eredményezi.

SELECT * FROM members LIMIT 9;

💡 Tipp: A LIMIT függvény a szerver által előállított sorok sorrendjéből választja ki a sorokat. Adjon hozzá egy RENDEZÉS záradékot kell használni, amikor a sorok azonossága számít, különben nem garantált, hogy az „első 10 tag” kétszer ugyanazt a kilenc személyt jelenti.

A sorok számának korlátozása a funkció első fele. Az ablak kezdőpontjának kiválasztása a második.

Az OFFSET érték használata a LIMIT lekérdezésben

Az OFFSET Az érték leggyakrabban a LIMIT kulcsszóval együtt használatos. Meghatározza, hogy a szerver melyik sorból kezdi az adatok lekérését, így az adott pont előtti sorok kimaradnak.

Tegyük fel, hogy korlátozott számú tagot szeretnénk a táblázat közepétől kezdve. Az alábbi szkript a második sortól indul, és az eredményt két rekordra korlátozza.

SELECT * FROM `members` LIMIT 1, 2;

Végrehajtás MySQL Workbench a myflixdb-vel szemben a következő eredményt adja.

Tagsági szám teljes_ nevek nemek születési_dátum regisztráció_dátuma valódi cím postázási cím elérhetőség email hitelkártyaszám
2 Janet Smith Jones 23-06-1980 NULL Melrose 123 NULL NULL jj@fstreet.com NULL
3 Robert Phil férfi 12-07-1989 NULL 3. utca 34 NULL 12345 rm@tstreet.com NULL

Megjegyzendő, hogy itt ELTOLÁS = 1, tehát a 2. sor az első visszaadott sor, és HATÁR = 2, ezért csak 2 rekord érkezik vissza.

A kétargumentumos formában az eltolás kerül először, a sorok száma pedig másodszorra, ami véletlenül könnyen megfordítható. MySQL elfogad egy explicit formát is, amely kiküszöböli a kétértelműséget, és ezt kell előnyben részesíteni az új kódban.

SELECT * FROM `members` LIMIT 2 OFFSET 1;

Mindkét utasítás ugyanazt a két sort adja vissza. Az eltolás megértésével a lapozási minta, amelyre minden listázó képernyő támaszkodik, közvetlenül kiesik belőle.

A lekérdezési eredmények oldalszámozása LIMIT és OFFSET használatával

A lapozás egy nagy eredményhalmazt számozott oldalakra oszt fel, és a LIMIT az OFFSET-tel együtt az a mechanizmus, amely ezt teszi. Minden oldalkérést két érték vezérel: az oldalméret, amely az egy képernyőn megjelenő rekordok számát mutatja, és a felhasználó által kért oldalszám.

Az eltolást egyetlen képlettel származtatjuk belőlük.

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

A 2. oldal megtartja ugyanazt a korlátot, és az eltolást egy oldalmérettel előrébb tolja.

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

Három szabály biztosítja a lapozott listák helyességét és gyorsaságát.

  1. Mindig rendezd: Egy ORDER BY nélküli lapozott lekérdezés ugyanazt a rekordot két különböző oldalon is megjelenítheti, egy másikat pedig teljesen elrejthet, mivel a szerver szabadon módosíthatja a sorok sorrendjét a hívások között.
  2. Rendezés egyedi oszlop szerint: A rendezési oszlopban lévő döntetlenek definiálatlanul hagyják a kötött sorok sorrendjét. Az elsődleges kulcs szerinti rendezés, vagy annak megadása döntetlen-megszakító tényezőként, megoldja a problémát.
  3. Nézd meg a mélyebb oldalakat: ELTOLÁS 100000 erő MySQL hogy százezer sort elolvasson és kidobjon, mielőtt visszaadná a következő húszat. A válaszidő az oldalszámmal együtt nő.

Nagyon mély lapozás esetén a kulcskészlet lapozása teljesen elkerüli az eltolást. A kihagyandó sorok számlálása helyett a lekérdezés megjegyzi az előző oldal utolsó kulcsát, és rákérdez az azt követő sorokra.

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

Ez a forma bármilyen mélységben gyors marad, mivel az index egyenesen a kezdőkulcsra ugrik, ahelyett, hogy az előtte lévő sorokat járná be. A kompromisszum az, hogy az oldalakat sorban kell végigjárni, tehát ugorjping közvetlenül az 500. oldalra már nem lehet ugrani.

LIMIT benne MySQL vs. TOP és FETCH FIRST

A LIMIT nem része minden SQL dialektusnak, ami akkor válik fontossá, amikor egy lekérdezésnek adatbázismotorok között kell mozognia. MySQL, PostgreSQLés SQLite megosztja a LIMIT kulcsszót. Az SQL Server a TOP kulcsszót használja, és Oracle a szabványos FETCH FIRST záradékot használja. Az alábbi táblázat összehasonlítja a hármat.

Kikötés Motor Példa Kihagyja a sorokat
HATÁR … ELTOLÁS MySQL, PostgreSQL, SQLite SELECT * FROM members LIMIT 20 OFFSET 40; Igen, OFFSET-tel
TOP SQL Server VÁLASSZA KI A TOP 20-AT * A tagok közül; Nem, OFFSET … FETCH szükséges
ELŐSZÖR Oracle, Db2, szabványos SQL SELECT * FROM members CSAK AZ ELSŐ 20 SOR LEKÉRÉSE; Igen, ELTOLÁS … SOROK

A viselkedés minden esetben ugyanaz: korlátozzuk a sorok számát, és opcionálisan először kihagyunk bizonyos számú sort. Csak a helyesírás változik. Egy olyan lekérdezésnek, amelynek egynél több motoron kell futnia, ezért a sorkorlátozó záradékot elkülönítenie kell, ahelyett, hogy szétszórná a kódbázisban.

GYIK

Igen. Mindkettő elfogadja az egyszerű sorszámlálót, például DELETE FROM tagok LIMIT 10. A kétargumentumos eltolás forma ott nem engedélyezett, így csak az érintett sorok száma korlátozható.

Az eltolás nullától számol, tehát az OFFSET 0 az első sortól, az OFFSET 1 pedig a másodiktól kezdődik. Maga a sorok száma egy egyszerű mennyiség, és normál számként olvasható.

Futtasson egy külön SELECT COUNT(*) lekérdezést ugyanazzal a WHERE záradékkal, de LIMIT nélkül. A számláló megmondja az alkalmazásnak, hogy hány oldal létezik, míg a korlátozott lekérdezés az aktuális oldal sorait adja vissza.

Gyakran igen. Az ügyfeleken belüli mesterséges intelligencia asszisztensek, például MySQL Workbench Írj át egy OFFSET lekérdezést egy WHERE záradékba az utoljára látott kulcs alapján. Győződj meg róla, hogy a rendezési oszlop egyedi és indexelt, mielőtt megbízol az átírásban.

Mivel a generált utasítás általában nem tartalmazza az ORDER BY utasítást. Explicit rendezés nélkül MySQL A sorokat tetszőleges sorrendben visszaadhatja, így ugyanaz a LIMIT minden futtatáskor más mintát hozhat létre. A rendezést Ön is beállíthatja.

Foglald össze ezt a bejegyzést a következőképpen: