"Предел 1000,25" против "предел 25 Смещение 1000"

Недавно я узнал, что 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 строк, найденных в базе данных, без учета сортировки и где.

11 голосов | спросил Martijn 2 J000000Wednesday14 2014, 15:42:35

1 ответ


7

В терминах работы

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 применяется на другой стадии.

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

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

Заключение

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

ответил RolandoMySQLDBA 2 J000000Wednesday14 2014, 22:43:29

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132