«Предел 1000,25» против «Предел 25 смещения 1000»

11

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

Допустим, у меня есть 10.000 строк в таблице, и я хочу 25 результатов из строки 1.000. Насколько я дошел, я мог сделать оба, чтобы получить тот же результат:

SELECT id,name,description FROM tablename LIMIT 1000,25
SELECT id,name,description FROM tablename LIMIT 25 OFFSET 1000

Что я хотел бы знать, так это разницу между ними.

  • Это действительно делает то же самое или мое понимание неверно?
  • Один медленнее / быстрее в больших таблицах
  • Изменяется ли результат смещения, когда я делаю WHERE column=1(скажем, столбец имеет> 100 различных значений)
  • Меняется ли результат смещения, когда я делаю ORDER BY column ASC(если он имеет случайные значения)

Если это «глупый» вопрос и кто-то знает какую-либо документацию, освещающую эту тему, пожалуйста, добавьте их в ответы.
Я чувствую, что смещение пропускает первые X строк, найденных в базе данных, без учета сортировки и где.

Мартейн
источник
Документация MySQL объясняет это прекрасно. Есть ли причина, по которой вам не интересно смотреть на это самостоятельно?
Сирида
1
«Для совместимости с PostgreSQL MySQL также поддерживает синтаксис смещения LIMIT row_count OFFSET». (с сайта dev.mysql.com/doc/refman/5.5/en/select.html ).
Сирида
Потому что это все еще не отвечает на мои вопросы. Из вашей цитаты (и их текста на странице) я должен сделать вывод, что смещение - это то же самое, что и ограничение, только написано по-другому, как если бы LIMIT был сокращенным селектором?
Мартейн
1
это другой синтаксис для выражения одной и той же вещи. Другие ваши подвопросы полностью отличаются от названия и первой части вашего поста.
Сирида
1
Я понимаю, что если это одно и то же, другие запросы не будут выполняться по-разному в любой ситуации. Я просто не был уверен, что это то же самое, это был ответ, который я искал, спасибо.
Мартейн

Ответы:

9

С точки зрения эксплуатации

SELECT id,name,description FROM tablename LIMIT 1000,25
SELECT id,name,description FROM tablename LIMIT 25 OFFSET 1000

в заявлениях нет абсолютно никакой разницы

Комментарий @ siride - это как раз то, что нужно.

LIMIT 1000,25 означает LIMIT 25 OFFSET 1000

Из той же документации

LIMIT row_count эквивалентно LIMIT 0, row_count

ВАШИ АКТУАЛЬНЫЕ ВОПРОСЫ

  • Это действительно делает то же самое или мое понимание неверно?
  • Один медленнее / быстрее в больших таблицах

Поскольку оба запроса одинаковы, нет никакой разницы

  • Изменяется ли результат смещения, когда я делаю WHERE column = 1 (скажем, столбец имеет> 100 различных значений)
  • Изменяется ли результат смещения, когда я делаю столбец ORDER BY ASC (если он имеет случайные значения)

Использование LIMITне меняет никаких наборов результатов. Они просто перемещаются в наборе результатов.

Этот запрос

SELECT id,name,description FROM tablename ORDER BY id LIMIT 1000,25

будет отличаться от

SELECT * FROM (SELECT id,name,description FROM tablename LIMIT 1000,25) A ORDER BY id;

потому что LIMIT применяется на другой стадии.

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

Второй запрос ничего не возвращает, если подзапрос имеет менее 1000 строк

ВЫВОД

Вам нужно будет сформировать запрос, чтобы убедиться, что вы сортируете данные на правильном этапе.

RolandoMySQLDBA
источник
1
Спасибо. Это: «В заявлениях нет абсолютно никакой разницы» было именно то, что я искал, и с этим небольшим количеством информации я могу видеть, что сортировка или где не имеет значения. Не был уверен насчет того, было ли это то же самое, и при кодировании дьявола кроется в деталях, я бы хотел знать наверняка :)
Martijn