MySQL LIMIT & OFFSET с примерами

⚡ Умное резюме

MySQL Ключевое слово LIMIT ограничивает количество строк, возвращаемых запросом, а значение OFFSET определяет, с какой строки начинается результат. Вместе они позволяют уменьшить размер наборов результатов, ускорить загрузку страниц и обеспечить постраничную навигацию по каждой записи.

  • 🔢 Основное поведение: Функция LIMIT N возвращает не более N строк. Если таблица содержит меньше N строк, она возвращает все строки без ошибки.
  • 0️⃣ Нулевой случай: LIMIT 0 не возвращает ни одной строки, что делает его недорогим способом проверки метаданных столбцов.
  • 📍 Синтаксис смещения: LIMIT 1, 2 пропускает одну строку и возвращает два, поэтому сначала записывается смещение, а затем количество строк.
  • 📄 Формула нумерации страниц: Параметр OFFSET равен размеру страницы, умноженному на номер страницы минус единица, что преобразует результирующий набор в нумерованные страницы.
  • 🇧🇷 Зависимость порядка: Без указания даты, MySQL Функция LIMIT может возвращать разные строки при каждом запуске, поэтому она детерминирована только при явной сортировке.
  • ⚙️ Подтверждение заявления: Параметр LIMIT также ограничивает количество строк, затронутых операциями UPDATE и DELETE, защищая большую таблицу от неограниченной записи.
  • 🐢 Ограничение по производительности: Большой вылет приводит к MySQL Прочитывайте и отбрасывайте каждую пропущенную строку, чтобы замедлить рост страниц по глубине.

MySQL ЛИМИТ и КОМПЕНСАЦИЯ

Что такое ключевое слово LIMIT в MySQL?

ОГРАНИЧЕНИЯ Ключевое слово ограничивает количество строк, возвращаемых в результате запроса. Его можно использовать с операторами SELECT, UPDATE и DELETE, поэтому оно ограничивает как количество строк, считываемых запросом, так и количество строк, на которые влияет операция записи.

Синтаксис ключевого слова LIMIT выглядит следующим образом.

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

ВОТ

  • «ВЫБРАТЬ {имя поля | *} FROM tableName(s)” это Оператор SELECT содержащий поля, которые мы хотели бы вернуть в нашем запросе.
  • «[ГДЕ условие]» Этот параметр является необязательным, но если он указан, то задает фильтр для результирующего набора данных. Предложение WHERE Функция применяется до LIMIT, поэтому фильтрация происходит первой, а ограничение применяется к тому, что осталось.
  • «LIMIT N» это ключевое слово, и N Если в качестве предела задано любое число, начиная с 0, то при установке 0 в качестве предела не возвращается ни одной записи. При установке числа, например, 5, возвращается пять записей. Если таблица содержит меньше записей, чем N, возвращаются все записи, и ошибка не возникает.

Синтаксис короткий, но стоит упомянуть о причине его существования перед примерами.

Почему следует использовать ключевое слово LIMIT?

Предположим, мы разрабатываемping Приложение работает на базе myflixdb. Разработчики системы попросили нас ограничить количество записей, отображаемых на странице, до 20, чтобы компенсировать медленную загрузку страниц. Как реализовать систему, отвечающую такому требованию?

Ключевое слово LIMIT обрабатывает именно такую ​​ситуацию. Вместо того чтобы загружать в приложение каждую строку данных и отбрасывать большую их часть, запрос возвращает 20 записей на странице, и база данных выполняет всю работу. Из этого вытекают три преимущества.

  • Более быстрый ответ: С диска считывается меньше данных, и по сети передается меньше данных.
  • Сниженное потребление памяти: Приложение отображает одну страницу строк, а не всю таблицу целиком.
  • Сейфер пишет: ОГРАНИЧЕНИЕ на ОБНОВЛЕНИЕ или УДАЛИТЬ Данное утверждение ограничивает количество строк, которые может затронуть ошибка.

MySQL Примеры запросов с использованием оператора LIMIT

Приведенные ниже примеры выполняются с использованием таблицы members базы данных myflixdb. Первый пример возвращает две строки и ничего больше.

SELECT * FROM members LIMIT 2;
Количество членов полные имена пол Дата рождения дата_регистрации Физический адрес почтовый адрес контактный_ номер e-mail Номер кредитной карты
1 Джанет Джонс F 21-07-1980 NULL, Первая улица, участок № 4 Частная сумка 0759 253 542 janetjones@yagoo.cm NULL,
2 Джанет Смит Джонс F 23-06-1980 NULL, Мелроуз 123 NULL, NULL, jj@fstreet.com NULL,

Как видно из приведенных выше результатов, были возвращены только два участника.

Получение списка из десяти (10) участников из базы данных

Предположим, нам нужен список из первых 10 зарегистрированных пользователей из базы данных Myflix. Приведенный ниже скрипт запрашивает их.

SELECT * FROM members LIMIT 10;

Выполнение скрипта дает результат, показанный ниже.

Количество членов полные имена пол Дата рождения дата_регистрации Физический адрес почтовый адрес контактный_ номер e-mail Номер кредитной карты
1 Джанет Джонс F 21-07-1980 NULL, Первая улица, участок № 4 Частная сумка 0759 253 542 janetjones@yagoo.cm NULL,
2 Джанет Смит Джонс F 23-06-1980 NULL, Мелроуз 123 NULL, NULL, jj@fstreet.com NULL,
3 Роберт Фил M 12-07-1989 NULL, 3-я улица, 34 NULL, 12345 rm@ttreet.com NULL,
4 Глория Уильямс F 14-02-1984 NULL, 2-я улица, 23 NULL, NULL, NULL, NULL,
5 Леонард Хофштадтер M NULL, NULL, Вудкрест NULL, 845738767 NULL, NULL,
6 Шелдон Купер M NULL, NULL, Вудкрест NULL, 976736763 NULL, NULL,
7 Раджеш Кутраппали M NULL, NULL, Вудкрест NULL, 938867763 NULL, NULL,
8 Лесли Винкль M 14-02-1984 NULL, Вудкрест NULL, 987636553 NULL, NULL,
9 Говард Воловиц M 24-08-1981 NULL, Южный парк Почтовый ящик 4563 987786553 lwolowitz[at]email.me NULL,

Было возвращено только 9 элементов, поскольку N в предложении LIMIT больше, чем количество записей в таблице. Запрос 9 строк напрямую приводит к тому же набору результатов.

SELECT * FROM members LIMIT 9;

💡 Совет: LIMIT выбирает строки из того порядка, в котором их выдает сервер. Добавьте СОРТИРОВАТЬ ПО оговорка применяется всякий раз, когда важна идентичность строк, в противном случае выражение «первые 10 участников» не гарантирует, что это будут одни и те же девять человек дважды.

Ограничение количества строк — это первая половина функции. Выбор начальной точки окна — вторая.

Использование значения OFFSET в запросе LIMIT

OFFSET Параметр value чаще всего используется вместе с ключевым словом LIMIT. Он указывает, с какой строки сервер начинает извлечение данных, поэтому строки до этой точки пропускаются.

Предположим, нам нужно получить ограниченное количество элементов, начиная со средней строки таблицы. Приведенный ниже скрипт начинает с второй строки и ограничивает результат двумя записями.

SELECT * FROM `members` LIMIT 1, 2;

Выполнение этого в MySQL Верстак При обращении к базе данных myflixdb получается следующий результат.

Количество членов полные имена пол Дата рождения дата_регистрации Физический адрес почтовый адрес контактный_ номер e-mail Номер кредитной карты
2 Джанет Смит Джонс F 23-06-1980 NULL, Мелроуз 123 NULL, NULL, jj@fstreet.com NULL,
3 Роберт Фил M 12-07-1989 NULL, 3-я улица, 34 NULL, 12345 rm@ttreet.com NULL,

Обратите внимание, что здесь СМЕЩЕНИЕ = 1Таким образом, строка №2 является первой возвращенной строкой, и LIMIT = 2Таким образом, возвращается только 2 записи.

В двухпараметрической форме сначала записывается смещение, а затем количество строк, что легко случайно перепутать местами. MySQL Также допускается явная форма, устраняющая неоднозначность, и именно её следует предпочитать в новом коде.

SELECT * FROM `members` LIMIT 2 OFFSET 1;

Оба оператора возвращают одни и те же две строки. С учетом смещения, шаблон пагинации, на который опирается каждый экран списка, напрямую вытекает из этого.

Как разбить результаты запроса на страницы с помощью LIMIT и OFFSET

Пагинация разбивает большой набор результатов на пронумерованные страницы, и для этого используются параметры LIMIT и OFFSET. Каждый запрос страницы определяется двумя значениями: размером страницы, то есть количеством записей, отображаемых на одном экране, и номером страницы, запрошенным пользователем.

Компенсация рассчитывается на их основе по единой формуле.

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

На второй странице сохраняется тот же лимит, но смещение сдвигается вперед на один размер страницы.

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

Три правила позволяют быстро и корректно отображать информацию в постраничном списке.

  1. Всегда сортировать: Запрос с постраничной навигацией без оператора ORDER BY может отображать одну и ту же запись на двух разных страницах и полностью скрывать другую, поскольку сервер может свободно изменять порядок строк между вызовами.
  2. Сортировка по уникальному столбцу: Если в столбце сортировки отображаются одинаковые значения, порядок строк, в которых есть совпадения, остается неопределенным. Сортировка по первичному ключу или добавление его в качестве критерия разрешения неоднозначностей устраняет эту проблему.
  3. Смотрите на глубокие страницы: Смещение 100000 сил MySQL Прочитать сто тысяч строк и отбросить их, прежде чем вернуть следующие двадцать. Время отклика увеличивается с номером страницы.

При очень глубокой постраничной навигации пагинация на основе набора ключей полностью исключает смещение. Вместо подсчета строк для пропуска, запрос запоминает последний ключ с предыдущей страницы и запрашивает строки после него.

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

Эта форма обеспечивает высокую скорость работы на любой глубине, поскольку индекс переходит непосредственно к начальному ключу, а не проходит строки перед ним. Компромисс заключается в том, что страницы необходимо проходить последовательно, поэтому переходы между ними невозможны.ping Переход непосредственно на страницу 500 больше невозможен.

ЛИМИТУ в MySQL против TOP и FETCH FIRSTER

Параметр LIMIT присутствует не во всех диалектах SQL, что имеет значение, когда запрос необходимо перенести между различными системами управления базами данных. MySQL, PostgreSQL и SQLite Используйте ключевое слово LIMIT. SQL Server использует TOP, и Oracle Используется стандартный пункт «Сначала получить». В таблице ниже приведено сравнение трех вариантов.

пункт Двигатель Пример Пропускает строки
ЛИМИТОВОЕ СКИДКА… MySQL, PostgreSQL, SQLite SELECT * FROM members LIMIT 20 OFFSET 40; Да, со смещением.
ТОП SQL Server ВЫБЕРИТЕ 20 ЛУЧШИХ * ИЗ ЧИСЛА УЧАСТНИКОВ; Нет, требуется OFFSET… FETCH.
Сначала возьми Oracle, Db2, стандартный SQL ВЫБЕРИТЕ * ИЗ ЧИСЛА УЧАСТНИКОВ, ЧТОБЫ ПОЛУЧИТЬ ТОЛЬКО ПЕРВЫЕ 20 СТРОК; Да, с OFFSET… ROWS

В каждом случае поведение одинаково: ограничение количества строк и, при необходимости, пропуск определенного количества строк в начале. Меняется только написание. Поэтому запрос, который должен выполняться на нескольких движках, должен изолировать условие ограничения количества строк, а не разбрасывать его по всему коду.

Часто задаваемые вопросы (FAQ)

Да. Оба варианта принимают простой подсчет строк, например: УДАЛИТЬ FROM members LIMIT 10. Форма смещения с двумя аргументами здесь не допускается, поэтому можно ограничить только количество затронутых строк.

Смещение отсчитывается от нуля, поэтому смещение 0 начинается с первой строки, а смещение 1 — со второй. Само количество строк представляет собой обычную величину и читается как число.

Выполните отдельный запрос SELECT COUNT(*) с тем же условием WHERE, но без LIMIT. COUNT сообщает приложению, сколько страниц существует, а запрос с LIMIT возвращает строки для текущей страницы.

Часто — да. Искусственные интеллекты-помощники внутри таких клиентов, как... MySQL Верстак Преобразуйте запрос OFFSET в предложение WHERE по ключу "последнее обнаружение". Перед тем как доверять преобразованию, убедитесь, что столбец сортировки уникален и проиндексирован.

Потому что в сгенерированном запросе обычно отсутствует оператор ORDER BY. Без явной сортировки, MySQL Функция может возвращать строки в любом порядке, поэтому один и тот же параметр LIMIT может давать разные результаты при каждом запуске. Сортировку можно добавить самостоятельно.

Подведем итог этой публикации следующим образом: