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.

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 | hitelkártyaszám | |
|---|---|---|---|---|---|---|---|---|---|
| 1 | Janet Jones | nő | 21-07-1980 | NULL | 4. számú első utcai telek | Privát táska | 0759 alkalmazott | janetjones@yagoo.cm | NULL |
| 2 | Janet Smith Jones | nő | 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 | hitelkártyaszám | |
|---|---|---|---|---|---|---|---|---|---|
| 1 | Janet Jones | nő | 21-07-1980 | NULL | 4. számú első utcai telek | Privát táska | 0759 alkalmazott | janetjones@yagoo.cm | NULL |
| 2 | Janet Smith Jones | nő | 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 | nő | 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 | hitelkártyaszám | |
|---|---|---|---|---|---|---|---|---|---|
| 2 | Janet Smith Jones | nő | 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.
- 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.
- 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.
- 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.
