2010-05-12 3 views
2

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

Например ...

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

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

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

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

Thanks

ответ

4

Это зависит, если у вас есть ORDER BY. ORDER BY так или иначе требует весь набор результатов, поэтому его можно заказать.

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

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

+0

На самом деле, даже с 'ORDER BY' он все еще имеет эффект. Я не уверен, является ли это результатом того, как он сортируется, что он может остановить сортировку после сортировки первых строк _row_count_. См. Ссылку в моем ответе. – Phil

2

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

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

0

Here is some relevant documentation по данной теме с сайта MySQL.

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

2

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

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

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

0

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

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

Смежные вопросы