Всем привет. Хочу услышать мнения опытных людей, какой из абсолютно одинаковых запросов лучше? Код (Text): SELECT a.`client_bid_id` FROM `client_bid` a WHERE a.`client_bid_blocked` = 'n' AND NOT EXISTS ( SELECT 1 FROM `client_login` b WHERE b.`client_id` = a.`client_id` AND b.`client_login_type` = 'success' AND b.`client_login_date` > NOW() - INTERVAL 1 HOUR ) Код (Text): SELECT a.`client_bid_id` FROM `client_bid` a LEFT JOIN `client_login` b ON (b.`client_id` = a.`client_id` AND b.`client_login_type` = 'success' AND b.`client_login_date` > NOW() - INTERVAL 1 HOUR) WHERE a.`client_bid_blocked` = 'n' AND b.`client_id` IS NULL Прочитал довольно много, но так и не решил для себя - в каких случаях лучше not exits, а в каких - left join ... is null. not in у меня сразу отпал, как самый худший. План первого запроса: Код (Text): "id" "select_type" "table" "type" "possible_keys" "key" "key_len" "ref" "rows" "Extra" "1" "PRIMARY" "a" "ALL" \N \N \N \N "12" "Using where" "2" "DEPENDENT SUBQUERY" "b" "ALL" \N \N \N \N "1" "Using where" План второго запроса: Код (Text): "id" "select_type" "table" "type" "possible_keys" "key" "key_len" "ref" "rows" "Extra" "1" "SIMPLE" "a" "ALL" \N \N \N \N "12" "Using where" "1" "SIMPLE" "b" "ALL" \N \N \N \N "1" "Using where; Not exists; Using join buffer (Block Nested Loop)" Индексы я пока не применял, меня другое интересует.
Re: Какой из запросов лучше?, not exist / left join ... is n без индексов? Добавлено спустя 1 минуту 14 секунд: Re: Какой из запросов лучше?, not exist / left join ... is null попробую
Re: Какой из запросов лучше?, not exist / left join ... is n т.е. нужно смотреть на тот вариант, который с индексами будет работать быстрей и планировщик при этом будет давать верное количество rows, а не предполагаемое?
Re: Какой из запросов лучше?, not exist / left join ... is n совершенно верно (( Но с индексами есть свои тонкости, например, при удалении записи (;
Re: Какой из запросов лучше?, not exist / left join ... is n лучше будет если ты сам про них прочитаешь в оф. доке (;
Re: Какой из запросов лучше?, not exist / left join ... is n ну это несомненно но я пока даже намека не пойму, что может быть с удаляемой записью, если ее просто удалить - она просто удалится
Re: Какой из запросов лучше?, not exist / left join ... is n Оценивай запросы по такому принципу: оптимальный запрос должен отсекать как можно больше данных как можно раньше. Исходя из этого первый запрос безнадёжно плох. Второй при наличии индексов и, может быть, при некоторых перестановках условий можно заставить перебирать не все данные.
Re: Какой из запросов лучше?, not exist / left join ... is n с записью ничего, а вот с индексами будут (;
Re: Какой из запросов лучше?, not exist / left join ... is n то что хотел услышать, спасибо Добавлено спустя 1 минуту 14 секунд: Re: Какой из запросов лучше?, not exist / left join ... is null т.е. при удалении строки где есть индекс на какой-то колонке, таблица будет перестраиваться?
Re: Какой из запросов лучше?, not exist / left join ... is n на сколько я помню из оф. дока - "крошится последовательность" (
Re: Какой из запросов лучше?, not exist / left join ... is n индексов или первичного автоинкрементного ключа?
Re: Какой из запросов лучше?, not exist / left join ... is n возможно это на какой-то определенной версии мускуля? т.к. это же не совсем есть хорошо, должны разработчики исправить есть ли варианты избежания этого "крошения" или с этим мирится придется? и как понять, что последовательность индексов "покрошилась"? - запросы на выборку, которые работали с этими индексами, будут уже не так работать как до этого?
Re: Какой из запросов лучше?, not exist / left join ... is n это все лечится, через сброс и установки индексов заново, одним запросом (( иди уже почитай доку - там много чего интересного для себя найдешь (;
Re: Какой из запросов лучше?, not exist / left join ... is n да вот гуглю, но мне что-то кажется, что это уже устаревшая инфа или вообще не действительная. как-то не очень правдоподобно, ведь если так и было, то это не маленькая проблема после каждого удаления делать переустановку индексов
Re: Какой из запросов лучше?, not exist / left join ... is n вычитаешь свежую инфу - отпишись (( Будет интересно
Re: Какой из запросов лучше?, not exist / left join ... is n если найду, но мне кажется такая проблема маловероятна или вообще отсутствует
Re: Какой из запросов лучше?, not exist / left join ... is n В большинстве случаев join лучше. Очень часто подзапросы переписываются оптимизатором в джойн. Но, конечно, бывают и исключения.
Re: Какой из запросов лучше?, not exist / left join ... is n дописал первому и второму запросу после explain extended и в конце добавил show warnings, то получил в первом запросе такой еще нотайс - Field or reference 'a.client_id' of SELECT #2 was resolved in SELECT #1 в первом случае оптимизатор не переписал подзапрос в join Добавлено спустя 19 минут 6 секунд: Re: Какой из запросов лучше?, not exist / left join ... is null пока что нашел -
Re: Какой из запросов лучше?, not exist / left join ... is n да... это тоже давняя инфа. На хай-лоадерах не сразу делают удаление проиндексированных записей, а во время профилактики сервера ((