Всем привет
помогите!
как выбрать из базы строку,где id последнее?
("SELECT * FROM gen_uptv WHERE id='???' ")
как правильно написать,если к примеру я не знаю,сколько там всего айди?))
Всем привет
помогите!
как выбрать из базы строку,где id последнее?
("SELECT * FROM gen_uptv WHERE id='???' ")
как правильно написать,если к примеру я не знаю,сколько там всего айди?))
Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.
10 июля 2009 в 17:02
Павел:
Согласен, мальца тупанул. Но в любом случае равны будут только если оптимизатор в первом варианте не будет допускать сортировки всей таблицы(в MySql это так, в других базах неизвестно).
10 июля 2009 в 16:04
Константин, no topic? =)
Я бы на твоем месте создал новую тему с названием: "уровень изоляции транзакций" ибо это очень емкая тема для обсуждения!
P.s. Наши карманы еще не настолько полны, чтобы пользовать Оракла! =)
10 июля 2009 в 16:04
>> В Оракле есть специальная функция, которая возвращала последний id вставленной записии для текущего соединения
Вот на это я и намекал, когда писал "надеюсь вам не нужно узнать id только что вставленной записи"
>> Строчка с максимальным ИД не обязательно последняя, если ИД ставиться вручную.
Да, никто не уточнил, в данном случае id – просто число или это AUTO_INCREMENT, как обычно делают. Я имел в виду второй вариант
10 июля 2009 в 15:05
В sql не особо силен… но по поводу сортировок могу сказать:
1) Вычисление максимума выполняется за N шагов, т.к. в любос случае надо перебрать все элементы. За O(Log N) выполняется поиск известного значения в сортированном массиве.
2) Для поиска первых k элементов не надо сортировать массив полностью . А N Log N – это заведомо завышенная оценка. Сложность сортировки первых k элементов – O(N * Log K).
В обсуждаемом случае оба варианта должны быть примерно равны по скорости.
10 июля 2009 в 15:05
А если между вставкой и получением последнего id другой пользователь произведет свою вставку/удаление?
В Оракле есть специальная функция, которая возвращала последний id вставленной записии для текущего соединения, тем самым ограждая от действий других пользователей.
10 июля 2009 в 14:03
Строчка с максимальным ИД не обязательно последняя, если ИД ставиться вручную.
>>"Если LIMIT # используется с ORDER BY, MySQL закончит сортировку, как только найдет первые # строк, вместо того, чтобы сортировать всю таблицу. " >>
Т.е. разработчики MySQL предвидели запросы подобного вида и ввели условие в оптимизатор, что при наличие Limit, фактически выполняется не сортировка а поиск, в другой базе этого может не быть.
Игорь, насчет эквивалентности по нагрузке вы отчасти не правы, для нахождения MAX достаточно LOG n шагов. (алгоритм поиска с делением пополам – классика), а для сортировки N x LOG N (быстрая сортировка или сортировка слиянием).
10 июля 2009 в 12:05
>> Это как? Что значит "последняя строчка" в таблице?
последняя добавленная строчка в таблице.У нее и будет максимальный id
Цитата из документации MySQL:
"Если LIMIT # используется с ORDER BY, MySQL закончит сортировку, как только найдет первые # строк, вместо того, чтобы сортировать всю таблицу. "
//php.su/mysql/manual/?page=LIMIT_optimisation
P.S. не на почве 7 миллисекунд, а на почве 1,875-кратного прироста производительности) Нам же интересно выяснить, как оно там на самом деле происходит. Может в другой таблице миллисекунды у запросов поменяются местами
10 июля 2009 в 12:00
Господа, главное не опускаться до скандалов на почве 7-ми миллисекунд! =)
1) Владимир, движок действительно перебирает все значения в таблице, но не для того чтобы "конец стал началом", нет! Он просто сортирует все строки по колонке "id" ибо изначально они идут в порядке добавления!
2) Роман, Александр, Андрей, Вы же не считаете, что оператор MAX, ничего не перебирая, сразу находит наибольшее значение? Этот оператор должен пробежаться по всем строчкам в столбце и посравнивать их! Я считаю, что 'ORDER BY' и 'MAX' вполне эквивалентны по нагрузке! а тот факт, что запроса как таковых в "#8" 2, подкидывает еще пару камней в довесок!
10 июля 2009 в 11:00
> взята просто одна последняя строчка, без всяких сортировок
Это как? Что значит "последняя строчка" в таблице?
И еще. Если вы так считаете, то зачем писать ордер бай?
10 июля 2009 в 6:05
#8 самый адекватный
10 июля 2009 в 2:00
Александр,
Вы же не думаете, что в запросе
SELECT * FROM gen_uptv
ORDER BY id DESC
LIMIT 0, 1;
оптимизатор сперва выберет все значения из таблицы, потом отсортирует их и только после этого сделает LIMIT 0, 1?
Я конечно точно не знаю, но мне всегда казалось, что тут оптимизатор поймет, что нужно выбрать одну строку, а параметр ORDER BY просто укажет, что выбирать нужно с конца, в итоге будет взята просто одна последняя строчка, без всяких сортировок
upd: нашел на локалхосте какую-то таблицу и выполнил следующие запросы:
SELECT *
FROM `jos_modules`
ORDER BY id DESC
LIMIT 1
// Показывает записи 0 – 0 (1 всего, Запрос занял 0.0008 сек)
SELECT *
FROM `jos_modules`
WHERE id = (
SELECT MAX( id )
FROM jos_modules )
// Показывает записи 0 – 0 (1 всего, Запрос занял 0.0015 сек)]
Собственно, вот.
10 июля 2009 в 1:05
Есть подозрение что двойной запрос лучше, потому как отсутствует сортировка которая как известно по сложности n log n. Потому если оптимизатор не глуп, он сначало выполнит вложенный запрос за n шагов, а затем внешний за log n(поиск по индексу) и того = n+log n. Где n количество записей в таблице. Есть какое-то количество записей, после которого второй запрос становиться быстрее. Посколько записи в БД копяться лучше применять второй.
10 июля 2009 в 1:03
Этот запрос сложнее… Двойной ибо.
Но я готов выслушать аргументы – почему он лучше? =)
10 июля 2009 в 1:00
А зачем писать два запроса, когда можно сделать одним? Разве это дает преимущество в производительности?
10 июля 2009 в 0:04
лучше попробуй так
SELECT * FROM gen_uptv WHERE id=(SELECT MAX(id) FROM gen_uptv )
это называется подчиненные запросы)))
10 июля 2009 в 0:03
Этот код можно использовать, например для отображения последнего зарегестрированного пользователя или сообщения… Или еще много чего…
10 июля 2009 в 0:00
Надеюсь тебе не нужно было таким образом узнать id только что добавленной записи
9 июля 2009 в 23:03
SELECT * FROM gen_uptv
ORDER BY id DESC
LIMIT 0, 1;
9 июля 2009 в 23:03
спасибо))
9 июля 2009 в 22:05
а можно кодом,а не словами?))
9 июля 2009 в 22:04
отсортируй по спадающей и автоматически возьми первое значение…