MYSQL и предложение LIMIT - PullRequest
2 голосов
/ 12 мая 2010

Мне было интересно, ускорит ли добавление LIMIT 1 к запросу?

Например ...

У меня есть запрос, который в большинстве случаев возвращает 1 результат, но иногда возвращает 10, 100 или даже 1000 записей. Но я когда-нибудь захочу только первую запись.

Будет ли лимит 1 ускорять или не иметь значения?

Я знаю, что мог бы использовать GROUP BY, чтобы вернуть 1 результат, но это просто добавило бы больше вычислений.

Любые мысли с радостью приняты!

Спасибо

Ответы [ 5 ]

4 голосов
/ 12 мая 2010

Зависит от того, есть ли у вас ORDER BY. В любом случае для ORDER BY нужен полный набор результатов, поэтому его можно заказать.

Если у вас нет ORDER BY, он должен работать быстрее.

Во всех случаях он будет работать, по крайней мере, немного быстрее, поскольку, конечно, не нужно отправлять весь набор результатов.

2 голосов
/ 12 мая 2010

Все зависит от самого запроса. Если вы выполняете индексированный поиск (где indexedColumn = somevalue) или сортировку по индексированному столбцу (без предложения Where), то ограничение 1 действительно ускорит его. Если у вас есть объединения или несколько предложений where / order, то все очень быстро усложняется. Но главное, что нужно убрать, использование «LIMIT 1» НИКОГДА не замедляет запрос. Это иногда ускоряет его, но никогда не замедляет.

Теперь есть еще одна проблема при работе с PHP. По умолчанию PHP будет буферизовать весь набор результатов перед возвратом из запроса (mysql_query или mysqli-> query будут возвращаться только после загрузки всех записей). Таким образом, в то время как время запроса может немного изменяться пределом 1, время и память, которые PHP использует для буферизации результата, значительны. Представьте, что каждая строка содержит 200 байтов данных. Теперь ваш запрос возвращает 10000 строк. Это означает, что PHP должен выделить дополнительные 2 МБ памяти (на самом деле ближе к 10 МБ с накладными расходами на структуру переменных php), которые вы никогда не будете использовать. Выделение памяти может быть очень дорогим, поэтому общее правило - выделять только то, что вам нужно (или, как вам кажется, вам понадобится). Загрузка 10000 строк, когда вы хотите только 1, просто расточительна.

Объедините эти два эффекта, и вы поймете, почему, если вы хотите только 1 строку, вы должны ВСЕГДА использовать «LIMIT 1».

2 голосов
/ 12 мая 2010

Да!это будет!

Но чтобы быть уверенным, добавление «Limit 1» в конец вашего оператора sql займет всего секунду, так почему бы не попробовать и посмотреть

0 голосов
/ 12 мая 2010

Это основная цель предложения LIMIT: P Если вы знаете, сколько результатов вы хотите, вы должны ВСЕГДА указывать это число как LIMIT не только потому, что оно быстрее (если вы не выполняете ORDER BY), но чтобы быть более эффективным с памятью в вашем PHP-скрипте.

Примечание: я предполагаю, что вы используете MySQL с PHP, так как вы добавили PHP в теги. Если вы просто выбираете из MySQL напрямую (вне языка сценариев), то преимущество использования LIMIT при использовании ORDER BY состоит только в том, чтобы упростить управление результатами.

0 голосов
/ 12 мая 2010

Вот некоторая соответствующая документация на эту тему с сайта MySQL.

Кажется, это может ускорить процесс по-разному, в зависимости от других частей запроса. Я не уверен, поможет ли это, когда у вас нет предложений ORDER или GROUP или HAVING, кроме возможности немедленно остановиться, а не возвращать каждую строку результатов (что может быть достаточно большим, если вы получаете 100 000 записей).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...