Ускоряет ли добавление LIMIT 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 - это утверждение о самом запросе, которое вполне может содержать ошибку, такую ​​как неадекватно заданное условие соединения.
Джеффри Хантин, 01
1
@JeffreyHantin Достаточно честно, но за исключением случаев, когда вы пишете код для Mars Rover, вы пишете тесты для этого, а не загрязняете свой код.
Кристиан Враби
8
@JeffreyHantin Если предположение, что есть только один, верно, не приведет ли добавление LIMIT 2 к уничтожению любой оптимизации, поскольку он будет искать все строки? Добавление LIMIT 2 в этом случае не лучше (с точки зрения оптимизации), чем добавление вообще ничего.
Крис Миддлтон,
19

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

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

Посетите эту страницу для получения более подробной информации: Документация MySQL: Оптимизация LIMIT

Rjamestaylor
источник
На странице, на которую вы указали ссылку, говорится: «Если вы выбираете только несколько строк с помощью LIMIT, MySQL использует индексы в некоторых случаях, хотя обычно он предпочитает выполнить полное сканирование таблицы». Это не похоже на то, что сам запрос всегда обрабатывается как обычно.
che
хорошая точка зрения. Я делал обобщение, основываясь на наблюдениях, полученных при использовании EXPLAIN. Спасибо за улов.
rjamestaylor
Ссылка очень ценится. FWIW, большая часть этого ответа, похоже, применима к ситуациям, когда без Limit может быть большой набор результатов . Вопрос в том, имеет ли значение, когда только 1 строка когда-либо будет успешно соответствовать; в этом случае «набор результатов» представляет собой только 1 строку (даже без ограничения).
ToolmakerSteve
5

Если возвращается только 1 результат, то нет, LIMIT не ускорит его. Если результатов много, и вам нужен только первый результат, и нет операторов GROUP или ORDER by, тогда LIMIT сделает это быстрее.

Крис Эриксон
источник
2
Он должен быть быстрее даже с 1 строкой, если нет уникальных / первичных ключей, потому что он прекращает поиск после того, как обнаружит первое вхождение
the_nuts
Крис, твое первое предложение можно прочитать двумя способами. Если вы имеете в виду, что «может быть возвращена только 1 строка» (например, запрос уникального столбца), то то, что вы говорите, верно. OTOH, если вы имеете в виду «всякий раз, когда будет найден только 1 соответствующий результат», ограничение не ускорит работу: вы уверены? Разве иногда это не позволяет избежать необходимости втягивания дополнительных страниц?
ToolmakerSteve
5

Короче говоря, да. Если вы ограничите свой результат до 1, тогда, даже если вы «ожидаете» одного результата, запрос будет быстрее, потому что ваша база данных не будет просматривать все ваши записи. Он просто остановится, как только найдет запись, соответствующую вашему запросу.

Макс Александр Ханна
источник
1
Этот ответ вводит в заблуждение, потому что в нем отсутствует предостережение, замеченное в комментариях к другим ответам (7 лет назад!), Что если БД знает, что только одна запись может совпадать (например, запрос уникального столбца), то ограничение 1 не будет иметь никакого эффекта.
ToolmakerSteve
Шутки в сторону? Оптимизатор запросов может воспользоваться тем фактом , что некоторые условия гарантируют , что только одна запись , возможно , могут быть возвращены. Я указывал, что ваш ответ неверен ни при каких обстоятельствах. (И поэтому вычитает ценность из того, что уже было сказано годами ранее.) Если вы согласны, вы можете подтвердить правильность моего комментария. Если вы не согласны, вы можете пояснить, почему.
ToolmakerSteve
1

Если вы действительно ожидаете только одного результата, действительно имеет смысл добавить LIMIT к вашему запросу. Я не знаю, как работает MySQL, но уверен, что он не соберет результирующий набор из более чем 100 000 записей, чтобы просто усечь его до 1 в конце ..

ДРИАН
источник