За последние 24 часа нас посетил 63001 программист и 1744 робота. Сейчас ищет 891 программист ...

LIMIT 1 - зачем?

Тема в разделе "MySQL", создана пользователем rar, 6 окт 2009.

  1. rar

    rar Активный пользователь

    С нами с:
    9 дек 2008
    Сообщения:
    206
    Симпатии:
    0
    Адрес:
    Москва
    Многие рекомендуют ставить LIMIT 1 после всех условие в SQL-запросе, в котором по логике должна выдаваться одна строка. Можно это как-нибудь прокомментировать?
     
  2. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Смысла в конечном итоге 0.

    Если ты ждешь ровно одну строку, то ты только ее и обработаешь, сколько бы тебе не пришло :)

    Другой вопрос, что из-за собственной лени ты можешь не контролировать это в коде, а пользоватся тем же кодом, что обрабатывает и массив строк. Тогда LIMIT немного помогает тебе ленится.
     
  3. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    видимо, чтобы не тратить время на продолжение выполнения запроса после того как запись уже найдена. Может быть полезно если в таблице добуя записей, а найденная - не последняя. А если последняя, то просто не повредит.
     
  4. rar

    rar Активный пользователь

    С нами с:
    9 дек 2008
    Сообщения:
    206
    Симпатии:
    0
    Адрес:
    Москва
    То есть, с точки зрения оптимизации это даже лучше?
     
  5. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Это не совсем так. Точнее совсем не так
    Почитайте о том как работает LIMIT.

    Запрос в любом случае просмотрит все записи подошедшие по критерию и только потом будет применен LIMIT
     
  6. rar

    rar Активный пользователь

    С нами с:
    9 дек 2008
    Сообщения:
    206
    Симпатии:
    0
    Адрес:
    Москва
    Так разумное объяснение использования LIMIT 1 будет?
     
  7. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    Я потому и написал "видимо", что не знал как оно работает. Хотя http://php.su/mysql/manual/?page=LIMIT_optimisation говорит, что
     
  8. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    function (... $limit = 1)
    $query = 'SELECT .... LIMIT '.$limit
     
  9. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    У меня есть таблица связей "пользователи-группы", где на одного пользователя и группу должна быть только одна запись. Если я, при внесении этой записи в таблицу, не проверяю её наличие, то мне нужен лимит при выборке. Но это попахивает ламерством. Такие вещи надо проверять, а не прикручивать костыли в виде лимита.
     
  10. nimistar

    nimistar Активный пользователь

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    Hight - а я порой храмаю ... но чаще в подзапросах например:

    [sql]
    SELECT r.*,IFNULL((SELECT 1 FROM `#rules_ad#` r2 WHERE r2.`parent_ID`=r.`ID` LIMIT 0,1),0) as have_childs
    FROM `#rules_ad#` r ORDER BY `parent_ID`,`ID`
    [/sql]
     
  11. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Обращаю внимание! Сортировку

    Запрос к этому моменту отберет все миллион строк попавших под условие WHERE
     
  12. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Объяснения для LIMIT 1 уже были :)

    Для LIMIT N - это, например, упрощенная пагинация, в случае когда записи в таблицу добавляются/удаляются и ID не является порядковым номером записи.
     
  13. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    Эти три предложения - отдельные три предложения. Кроме сортировки там есть еще два. Одно о DISTINCT и одно о SQL_CALC_FOUND_ROWS. С сортировкой они не связаны.

    Вообще я спорить не собираюсь, т.к. не настолько в теме. Скорее самому интересно, как оно работает.
     
  14. Frozen

    Frozen Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    540
    Симпатии:
    0
    Адрес:
    Москва
    на выборку смысла мало. Есть смысл ставить при удаалении... ну так, на свякий...
     
  15. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    Некоторые умные люди рекомендуют использовать LIMIT при запросах с сортировкой только при грамотно расставленных индексах, а то получится что
     
  16. rar

    rar Активный пользователь

    С нами с:
    9 дек 2008
    Сообщения:
    206
    Симпатии:
    0
    Адрес:
    Москва
    Я так понял, в запросах SELECT:
    [sql]SELECT * FROM `table_name` WHERE `id` = <ID> LIMIT <N>[/sql]
    , когда есть уверенность в том, что нужно вернуть именно N строк, лучше использовать LIMIT, так как найдя эти N строк дальнейшее сканирование таблицы не будет, что должно положительно сказаться на производительности. Так ведь?

    Вот здесь, вроде, тоже об этом написано: http://dev.mysql.com/doc/refman/5.1/en/ ... ation.html
     
  17. Frozen

    Frozen Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    540
    Симпатии:
    0
    Адрес:
    Москва
     
  18. rar

    rar Активный пользователь

    С нами с:
    9 дек 2008
    Сообщения:
    206
    Симпатии:
    0
    Адрес:
    Москва
    Читаем тут: http://dev.mysql.com/doc/refman/5.1/en/ ... ation.html
     
  19. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Да обчитайтесь

    "MySQL uses indexes in some cases"

    А в каких случаях оно будет использовать индексы - одному хрену известно.
    Тогда как обычно "when normally it would prefer to do a full table scan."

    "MySQL ends the sorting as soon as it has found the first row_count rows of the sorted result, rather than sorting the entire result"
    Оканчивает сортировку РЕЗУЛЬТАТА. Т.е. результат все равно выбирается полностью.

    И т.д.

    Без знания детальной механики выполнения запроса (когда и как применяются WHEN, когда происходит ORDER и т.д.) сказать большего нельзя.
     
  20. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    Да отстань ты от сортировки.

    As soon as MySQL has sent the required number of rows to the client, it aborts the query unless you are using SQL_CALC_FOUND_ROWS.

    Прекращает ЗАПРОС. То есть полностью не выбирает.
     
  21. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Мда.

    1. Чтобы что-то послать. Надо сначала это найти. И только потом послать :)
    В случае наличия GROUP BY нервно курите в сторонке.
    Во всех остальных случаях вы правы если MySQL применяет условия к КАЖДОЙ записи отдельно (это было бы изуверство).

    2. У вас есть информация, что MySQL начинает отправлять результаты клиенту в произвольный момент времени?
    А информация о том, что затраты времени равномерно делятся на произвольное число записей?
    Т.е. LIMIT 10 из 1000 записей по 100 байт будет быстрее LIMIT 500 хотя бы в 5 раз (я уж не прошу про 50).

    У меня такой информации нет :)
     
  22. kostyl

    kostyl Guest

    Как верно заметил Kreker в основном это диктует интерфейс, поэтому добавляется лимит. А то что он добавляется в постраничный вывод - дык это само собой разумеется.
     
  23. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Ах да. Еще вы путаете сам процесс выборки на сервере
    И запрос клиента.

    Это разные вещи. Для клиента запрос выполнен когда он получил результат.
    Для сервера - когда он нашел результат.

    Разница - это процесс передачи результата клиенту.