MySQL LIMIT & OFFSET s příklady

⚡ Chytré shrnutí

Jedno MySQL Klíčové slovo LIMIT omezuje počet řádků, které dotaz vrátí, a hodnota OFFSET určuje, od kterého řádku výsledek začíná. Společně udržují sady výsledků malé, umožňují rychlé načítání stránek a umožňují stránkování záznam po záznamu.

  • 🔢 Základní chování: Funkce LIMIT N vrací maximálně N řádků. Tabulka obsahující méně řádků než N vrátí všechny řádky bez chyby.
  • 0️⃣ Nulový případ: LIMIT 0 nevrací žádné řádky, což z něj činí levný způsob kontroly metadat sloupců.
  • 📍 Syntaxe ofsetu: Funkce LIMIT 1, 2 přeskočí jeden řádek a vrátí dva, takže posun se zapíše jako první a počet řádků jako druhý.
  • 📄 Vzorec pro stránkování: OFFSET se rovná velikosti stránky vynásobené číslem stránky mínus jedna, čímž se výsledná sada promění v očíslované stránky.
  • ↕️ Závislost objednávky: Bez ORDER BY, MySQL může při každém spuštění vracet různé řádky, takže LIMIT je deterministický pouze s explicitním řazením.
  • ⚙️ Podpora prohlášení: Funkce LIMIT také omezuje počet řádků ovlivněných funkcemi UPDATE a DELETE, čímž chrání velkou tabulku před neomezeným zápisem.
  • 🐢 Výkonnostní omezení: Velký posun způsobuje MySQL přečíst a zahodit každý přeskočený řádek, takže hluboké stránky rostou pomaleji.

MySQL LIMIT a POSUN

Co je klíčové slovo LIMIT v MySQL?

Jedno LIMIT Klíčové slovo omezuje počet řádků vrácených ve výsledku dotazu. Lze jej použít s příkazy SELECT, UPDATE a DELETE, takže omezuje řádky, které dotaz čte, a také řádky, které zápis ovlivňuje.

Syntaxe klíčového slova LIMIT je následující.

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

ZDE

  • “SELECT {název pole | *} FROM tableName(s)” je příkaz SELECT obsahující pole, která bychom chtěli v našem dotazu vrátit.
  • “[KDE podmínka]” je volitelný, ale pokud je zadán, určuje filtr pro výslednou sadu. klauzule WHERE se aplikuje před LIMIT, takže filtrování probíhá jako první a omezení se aplikuje na to, co přežije.
  • „LIMIT N“ je klíčové slovo a N je libovolné číslo začínající 0. Zadáním 0 jako limitu se nevrátí žádné záznamy. Zadáním čísla, například 5, se vrátí pět záznamů. Pokud tabulka obsahuje méně záznamů než N, vrátí se všechny a nedojde k žádné chybě.

Syntaxe je krátká, ale důvod její existence stojí za to uvést před příklady.

Proč bychom měli používat klíčové slovo LIMIT?

Předpokládejme, že se vyvíjímeping aplikace, která běží nad myflixdb. Návrháři systému nás požádali, abychom omezili počet záznamů zobrazených na stránce na 20 záznamů, abychom čelili pomalému načítání. Jak implementujeme systém, který splňuje tento požadavek?

Klíčové slovo LIMIT přesně tuto situaci řeší. Místo načtení každého řádku člena do aplikace a zahození většiny z nich dotaz vrátí 20 záznamů na stránku a databáze provede práci. Z toho vyplývají tři výhody.

  • Rychlejší odezva: Z disku se načte méně dat a sítí se prochází méně dat.
  • Nižší využití paměti: Aplikace uchovává jednu stránku řádků, nikoli celou tabulku.
  • Safer píše: LIMIT na AKTUALIZACI nebo DELETE Příkaz omezuje, kolika řádků se může chyba dotknout.

MySQL Příklady dotazů LIMIT

Níže uvedené příklady fungují na základě tabulky members v databázi myflixdb. První z nich vrací dva řádky a nic víc.

SELECT * FROM members LIMIT 2;
členské číslo celá_ jména rod datum_narození datum_registrace fyzická adresa poštovní_ adresa kontaktní číslo e-mail číslo kreditní karty
1 Janet Jonesová Žena 21-07-1980 NULL První ulice pozemek č. 4 Soukromá taška 0759 253 542 janetjones@yagoo.cm NULL
2 Janet Smith Jonesová Žena 23-06-1980 NULL Melrose 123 NULL NULL jj@fstreet.com NULL

Jak ukazuje výše uvedený výsledek, byli vráceni pouze dva členové.

Získání seznamu deseti (10) členů z databáze

Předpokládejme, že chceme seznam prvních 10 registrovaných členů z databáze Myflix. Následující skript se na ně zeptá.

SELECT * FROM members LIMIT 10;

Spuštění skriptu dává výsledek zobrazený níže.

členské číslo celá_ jména rod datum_narození datum_registrace fyzická adresa poštovní_ adresa kontaktní číslo e-mail číslo kreditní karty
1 Janet Jonesová Žena 21-07-1980 NULL První ulice pozemek č. 4 Soukromá taška 0759 253 542 janetjones@yagoo.cm NULL
2 Janet Smith Jonesová Žena 23-06-1980 NULL Melrose 123 NULL NULL jj@fstreet.com NULL
3 Robert Phil Muž 12-07-1989 NULL 3. ulice 34 NULL 12345 rm@tstreet.com NULL
4 Gloria Williamsová Žena 14-02-1984 NULL 2. ulice 23 NULL NULL NULL NULL
5 Leonard Hofstadter Muž NULL NULL Woodcrest NULL 845738767 NULL NULL
6 Sheldon Cooper Muž NULL NULL Woodcrest NULL 976736763 NULL NULL
7 Rajesh Koothrappali Muž NULL NULL Woodcrest NULL 938867763 NULL NULL
8 Leslie Winkle Muž 14-02-1984 NULL Woodcrest NULL 987636553 NULL NULL
9 Howard Wolowitz Muž 24-08-1981 NULL South Park PO Box 4563 987786553 lwolowitz[zavináč]email.me NULL

Bylo vráceno pouze 9 členů, protože N v klauzuli LIMIT je větší než počet záznamů v tabulce. Explicitní požadavek na 9 řádků vrátí stejnou sadu výsledků.

SELECT * FROM members LIMIT 9;

💡 Tip: Funkce LIMIT vybírá řádky z libovolného pořadí, které server vygeneruje. Přidejte SEŘADIT PODLE klauzuli vždy, když záleží na identitě řádků, jinak není zaručeno, že „prvních 10 členů“ bude znamenat stejných devět osob dvakrát.

Omezení počtu řádků je první polovina funkce. Výběr místa začátku okna je druhá.

Použití hodnoty OFFSET v dotazu LIMIT

Jedno OFFSET Argument value se nejčastěji používá společně s klíčovým slovem LIMIT. Určuje, od kterého řádku server začne načítat data, takže řádky před tímto bodem se přeskočí.

Předpokládejme, že chceme omezený počet členů počínaje od středu tabulky. Následující skript začíná na druhém řádku a omezuje výsledek na dva záznamy.

SELECT * FROM `members` LIMIT 1, 2;

Provedení v MySQL Workbench proti myflixdb dává následující výsledek.

členské číslo celá_ jména rod datum_narození datum_registrace fyzická adresa poštovní_ adresa kontaktní číslo e-mail číslo kreditní karty
2 Janet Smith Jonesová Žena 23-06-1980 NULL Melrose 123 NULL NULL jj@fstreet.com NULL
3 Robert Phil Muž 12-07-1989 NULL 3. ulice 34 NULL 12345 rm@tstreet.com NULL

Všimněte si, že zde POSUN = 1, proto je řádek č. 2 prvním vráceným řádkem a LIMIT = 2, proto se vracejí pouze 2 záznamy.

Ve dvouargumentové formě se jako první zapíše offset a jako druhý počet řádků, což lze snadno omylem obrátit. MySQL také akceptuje explicitní formu, která odstraňuje nejednoznačnost, a je to ta, která se v novém kódu preferuje.

SELECT * FROM `members` LIMIT 2 OFFSET 1;

Oba příkazy vracejí stejné dva řádky. S pochopením offsetu z něj přímo vyplývá stránkovací vzor, ​​na kterém se každá obrazovka s výpisem spoléhá.

Jak stránkovat výsledky dotazu pomocí funkcí LIMIT a OFFSET

Stránkování rozděluje velkou sadu výsledků na očíslované stránky a funkce LIMIT spolu s funkcí OFFSET je mechanismus, který to dělá. Každý požadavek na stránku řídí dvě hodnoty: velikost stránky, což je počet záznamů zobrazených na jedné obrazovce, a číslo stránky požadované uživatelem.

Offset se z nich odvozuje pomocí jediného vzorce.

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

Stránka 2 si zachovává stejný limit a posune offset dopředu o jednu velikost stránky.

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

Tři pravidla udržují stránkovaný výpis správný a rychlý.

  1. Vždy seřaďte: Stránkovaný dotaz bez ORDER BY může zobrazit stejný záznam na dvou různých stránkách a další zcela skrýt, protože server může mezi voláními libovolně měnit pořadí řádků.
  2. Seřadit podle jedinečného sloupce: Vázání ve sloupci řazení nechává pořadí vázaných řádků nedefinované. Řazení podle primárního klíče nebo jeho přidání jako rozdělovače řazení tento problém odstraňuje.
  3. Sledujte hluboké stránky: OFFSET 100000 sil MySQL přečíst sto tisíc řádků a zahodit je před vrácením dalších dvaceti. Doba odezvy roste s číslem stránky.

Pro velmi hluboké stránkování se stránkování sadou klíčů zcela vyhýbá posunu. Místo počítání řádků, které se mají přeskočit, si dotaz pamatuje poslední klíč z předchozí stránky a ptá se na řádky za ním.

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

Tato forma zůstává rychlá v jakékoli hloubce, protože index skáče přímo na počáteční klíč, místo aby procházel řádky před ním. Nevýhodou je, že stránky je nutné procházet postupně, takže skákatping Přímý přechod na stranu 500 již není možný.

LIMIT v MySQL vs. TOP a FETCH FIRST

LIMIT není součástí každého dialektu SQL, což je důležité, jakmile se dotaz musí přesouvat mezi databázovými stroji. MySQL, PostgreSQL, a SQLite sdílejte klíčové slovo LIMIT. SQL Server používá TOP a Oracle používá standardní klauzuli FETCH FIRST. Níže uvedená tabulka porovnává tyto tři.

Doložka Motor Příklad Přeskočí řádky
LIMIT … POSUN MySQL, PostgreSQL, SQLite VYBRAT * Z členů LIMIT 20 POSUN 40; Ano, s OFFSET
VÝŠKA SQL Server VYBERTE 20 NEJLEPŠÍCH * Z ČLENŮ; Ne, je vyžadován OFFSET … FETCH
NEJDŘÍVE PŘINÁŠEJTE Oracle, Db2, standardní SQL SELECT * FROM members NAČÍST POUZE PRVNÍCH 20 ŘÁDKŮ; Ano, s ODSAZENÍM … ŘÁDKŮ

Chování je v obou případech stejné: omezit počet řádků a volitelně nejprve přeskočit několik řádků. Mění se pouze pravopis. Dotaz, který musí běžet na více než jednom enginu, by proto měl klauzuli omezující počet řádků izolovat, spíše než ji rozptýlit po kódové základně.

Nejčastější dotazy

Ano. Oba akceptují prostý počet řádků, například DELETE FROM členů LIMIT 10. Dvouargumentový offset zde není povolen, takže lze omezit pouze počet ovlivněných řádků.

Offset se počítá od nuly, takže OFFSET 0 začíná na prvním řádku a OFFSET 1 začíná na druhém. Samotný počet řádků je prostá veličina a čte se jako normální číslo.

Spusťte samostatný příkaz SELECT COUNT(*) se stejnou klauzulí WHERE, ale bez LIMIT. Proměnná count říká aplikaci, kolik stránek existuje, zatímco omezený dotaz vrací řádky pro aktuální stránku.

Často ano. Asistenti umělé inteligence v klientech, jako například MySQL Workbench Přepište dotaz OFFSET do klauzule WHERE na posledním zobrazeném klíči. Předtím, než přepsání povolíte, ověřte, zda je sloupec řazení jedinečný a indexovaný.

Protože vygenerovaný příkaz obvykle vynechává ORDER BY. Bez explicitního řazení, MySQL může vrátit řádky v libovolném pořadí, takže stejný LIMIT může při každém spuštění vytvořit jiný vzorek. Řazení přidejte sami.

Shrňte tento příspěvek takto: