"Обмеження 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 це прекрасно пояснює. Чи є причина, що вам не було цікаво подивитися на це самостійно?
siride

1
"Для сумісності з PostgreSQL MySQL також підтримує синтаксис зсуву LIMIT row_count OFFSET." (від dev.mysql.com/doc/refman/5.5/uk/select.html ).
Сіріде

Тому що це все ще не відповідає на мої запитання. З вашої цитати (та їх тексту на сторінці) я повинен зробити висновок, що зміщення - це те саме, що і межа, лише написане по-іншому, як ніби LIMIT - це вибір скорочень?
Мартійн

1
це різний синтаксис для вираження одного і того ж. Ваші інші додаткові запитання абсолютно не відрізняються від назви та першої частини вашої публікації.
siride

1
Я розумію, що якщо це одне й те саме, інші запити не будуть виконані по-різному в будь-якій ситуації. Я просто не був переконаний, що це одне й те саме, це була відповідь, яку я шукав, дякую.
Martijn

Відповіді:


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 = 1 (скажімо, стовпець має> 100 різних значень)
  • Чи змінюється результат зміщення, коли я виконую ЗАМОВЛЕННЯ В стовпці 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 рядків

ВИСНОВОК

Вам доведеться ліпити запит, щоб переконатися, що ви сортуєте дані на потрібному етапі


1
Дякую. Це: "Різниці в твердженнях абсолютно немає" було саме те, що я шукав, і за допомогою цієї інформації я бачу це сортування або там, де це не має значення. Не був упевнений у тому, що це все те саме, і в кодуванні диявола є деталі, я хотів би точно знати :)
Martijn
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.