Чи додавання "ОБМЕЖЕННЯ 1" до запитів MySQL робить їх швидшими, коли ви знаєте, що результат буде лише 1?


86

Коли я додаю LIMIT 1 до запиту MySQL, чи зупиняє він пошук після того, як знаходить 1 результат (таким чином, робить це швидшим), чи все-таки отримує всі результати та скорочує в кінці?


1
Ні, якщо в стовпці фільтра є UNIQUE(або PRIMARY KEY) обмеження (або індекс). stackoverflow.com/questions/8467092 / ...
ma11hew28

Відповіді:


81

Залежно від запиту, додавання речення limit може мати величезний вплив на продуктивність. Якщо вам потрібен лише один рядок (або ви точно знаєте, що лише один рядок може задовольнити запит), і не впевнені в тому, як його буде виконувати внутрішній оптимізатор (наприклад, речення WHERE, що не потрапляє в індекс тощо), тоді ви обов’язково повинні додати речення LIMIT.

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


30
Для цілей запобігання помилкам, можливо, ви захочете надіслати LIMIT 2, а потім поскаржитися чи вибухнути, якщо ваше однорядкове припущення не відповідає.
Джеффрі Хантін,

6
@JeffreyHantin Якщо насправді може бути лише одне, вам слід віддати перевагу додаванню унікального обмеження до бази даних. Набагато чистіший, а потім зіпсує ваш код за допомогою перевірок розумності.
Cristian Vrabie

@CristianVrabie Якщо це можна виразити як унікальне обмеження, звичайно, але це твердження про дані в таблицях. Надсилання LIMIT 2 і перевірка на 1 є твердженням про сам запит, який цілком може містити помилку, таку як неадекватно вказана умова приєднання.
Джеффрі Хантін,

1
@JeffreyHantin Досить справедливо, але крім випадків, коли ви кодуєте марсохід, ви пишете тести на це, а не забруднюєте свій код.
Cristian Vrabie

8
@JeffreyHantin Якщо припущення, що існує лише одне, є правильним, чи не додавання LIMIT 2 не вб’є жодної оптимізації, оскільки воно буде шукати всі рядки? Додавання LIMIT 2 у такому випадку не є кращим (в оптимізаційному відношенні), ніж додаванням взагалі нічого.
Кріс Міддлтон,

19

Обмеження може вплинути на продуктивність запиту (див. Коментарі та посилання нижче), а також зменшує набір результатів, що виводиться MySQL. Для запиту, в якому ви очікуєте єдиного результату, є переваги.

Більше того, обмеження набору результатів насправді може пришвидшити загальний час запиту, оскільки передача великих наборів результатів використовує пам’ять і потенційно створює тимчасові таблиці на диску. Я згадую про це, оскільки нещодавно побачив програму, яка не використовувала limit kill server через величезні набори результатів, а з обмеженням на місце використання ресурсів надзвичайно впало.

Перегляньте цю сторінку, щоб дізнатися більше: Документація MySQL: Оптимізація ОБМЕЖЕНЬ


Сторінка, на яку ви зв’язали, говорить: "Якщо ви вибираєте лише кілька рядків з LIMIT, MySQL використовує індекси в деяких випадках, коли зазвичай воліє виконати повне сканування таблиці." Це не схоже на те, що сам запит завжди обробляється як зазвичай.
че

гарна думка. Я робив узагальнення на основі спостережень за допомогою EXPLAIN. Дякую за улов.
rjamestaylor

Посилання дуже вдячне. FWIW, більшість цієї відповіді, здається, стосується ситуацій, коли без обмеження може бути великий набір результатів . Задається питання, чи важливо, коли колись успішно збігатиметься лише 1 рядок; у цьому випадку "набір результатів" складає лише 1 рядок (навіть без обмеження).
інструменталіст,

5

Якщо повертається лише 1 результат, тоді ні, LIMIT не зробить це швидшим. Якщо результатів багато, і вам потрібен лише перший результат, і немає інструкцій GROUP або ORDER by then, LIMIT зробить це швидше.


2
Це має бути швидше навіть з 1 рядком, якщо немає унікальних / первинних ключів, оскільки він припиняє пошук після того, як знаходить перше входження
the_nuts

Кріс, твоє перше речення можна прочитати одним із двох способів. Якщо ви маєте на увазі "можна повернути лише 1 рядок" (наприклад, запит до унікального стовпця), тоді те, що ви говорите, відповідає дійсності. ОТО, якщо ви маєте на увазі "коли буде знайдено лише 1 відповідний результат", обмеження не пришвидшить: ви впевнені? Хіба іноді не уникає необхідності втягувати додаткові сторінки?
ToolmakerSteve

5

Коротше, відповідь - так. Якщо ви обмежите свій результат до 1, то навіть якщо ви "очікуєте" одного результату, запит буде швидшим, оскільки ваша база даних не буде переглядати всі ваші записи. Він просто зупиниться, коли знайде запис, який відповідає вашому запиту.


1
Ця відповідь вводить в оману, оскільки їй бракує застереження, котре видно з коментарів до інших відповідей (7 років тому!): Якщо БД знає, що може збігатися лише один запис (наприклад, запит до унікального стовпця), то обмеження 1 не матиме ефекту.
ToolmakerSteve

Серйозно? Оптимізатор запитів може скористатися тим, що певні умови гарантують можливість повернення лише 1 запису. Я вказував, що ваша відповідь не є правильною за будь-яких обставин. (І тому віднімає значення з того, що вже було сказано роками раніше.) Якщо ви згодні, ви можете визнати правильність мого коментаря. Якщо ви не згодні, можете пояснити, чому.
ToolmakerSteve

1

Якщо ви дійсно очікуєте лише одного результату, дійсно має сенс додати ОБМЕЖЕННЯ до свого запиту. Я не знаю внутрішньої роботи MySQL, але я впевнений, що він не збере набір результатів із 100000 записів +, аби просто скоротити його до 1 в кінці.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.