Многие рекомендуют ставить LIMIT 1 после всех условие в SQL-запросе, в котором по логике должна выдаваться одна строка. Можно это как-нибудь прокомментировать?
Смысла в конечном итоге 0. Если ты ждешь ровно одну строку, то ты только ее и обработаешь, сколько бы тебе не пришло Другой вопрос, что из-за собственной лени ты можешь не контролировать это в коде, а пользоватся тем же кодом, что обрабатывает и массив строк. Тогда LIMIT немного помогает тебе ленится.
видимо, чтобы не тратить время на продолжение выполнения запроса после того как запись уже найдена. Может быть полезно если в таблице добуя записей, а найденная - не последняя. А если последняя, то просто не повредит.
Это не совсем так. Точнее совсем не так Почитайте о том как работает LIMIT. Запрос в любом случае просмотрит все записи подошедшие по критерию и только потом будет применен LIMIT
Я потому и написал "видимо", что не знал как оно работает. Хотя http://php.su/mysql/manual/?page=LIMIT_optimisation говорит, что
У меня есть таблица связей "пользователи-группы", где на одного пользователя и группу должна быть только одна запись. Если я, при внесении этой записи в таблицу, не проверяю её наличие, то мне нужен лимит при выборке. Но это попахивает ламерством. Такие вещи надо проверять, а не прикручивать костыли в виде лимита.
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]
Обращаю внимание! Сортировку Запрос к этому моменту отберет все миллион строк попавших под условие WHERE
Объяснения для LIMIT 1 уже были Для LIMIT N - это, например, упрощенная пагинация, в случае когда записи в таблицу добавляются/удаляются и ID не является порядковым номером записи.
Эти три предложения - отдельные три предложения. Кроме сортировки там есть еще два. Одно о DISTINCT и одно о SQL_CALC_FOUND_ROWS. С сортировкой они не связаны. Вообще я спорить не собираюсь, т.к. не настолько в теме. Скорее самому интересно, как оно работает.
Некоторые умные люди рекомендуют использовать LIMIT при запросах с сортировкой только при грамотно расставленных индексах, а то получится что
Я так понял, в запросах 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
Да обчитайтесь "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 и т.д.) сказать большего нельзя.
Да отстань ты от сортировки. 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. Прекращает ЗАПРОС. То есть полностью не выбирает.
Мда. 1. Чтобы что-то послать. Надо сначала это найти. И только потом послать В случае наличия GROUP BY нервно курите в сторонке. Во всех остальных случаях вы правы если MySQL применяет условия к КАЖДОЙ записи отдельно (это было бы изуверство). 2. У вас есть информация, что MySQL начинает отправлять результаты клиенту в произвольный момент времени? А информация о том, что затраты времени равномерно делятся на произвольное число записей? Т.е. LIMIT 10 из 1000 записей по 100 байт будет быстрее LIMIT 500 хотя бы в 5 раз (я уж не прошу про 50). У меня такой информации нет
Как верно заметил Kreker в основном это диктует интерфейс, поэтому добавляется лимит. А то что он добавляется в постраничный вывод - дык это само собой разумеется.
Ах да. Еще вы путаете сам процесс выборки на сервере И запрос клиента. Это разные вещи. Для клиента запрос выполнен когда он получил результат. Для сервера - когда он нашел результат. Разница - это процесс передачи результата клиенту.