За последние 24 часа нас посетили 16389 программистов и 1556 роботов. Сейчас ищут 1588 программистов ...

Какой из запросов лучше?, not exist / left join ... is null

Тема в разделе "MySQL", создана пользователем lex-romanow, 3 апр 2016.

  1. lex-romanow

    lex-romanow Активный пользователь

    С нами с:
    24 сен 2014
    Сообщения:
    50
    Симпатии:
    1
    Всем привет. Хочу услышать мнения опытных людей, какой из абсолютно одинаковых запросов лучше?

    Код (Text):
    1. SELECT a.`client_bid_id`
    2. FROM `client_bid` a
    3. WHERE a.`client_bid_blocked` = 'n'
    4. AND NOT EXISTS
    5. (
    6. SELECT 1
    7. FROM `client_login` b
    8. WHERE b.`client_id` = a.`client_id`
    9. AND b.`client_login_type` = 'success'
    10. AND b.`client_login_date` > NOW() - INTERVAL 1 HOUR
    11. )
    Код (Text):
    1. SELECT a.`client_bid_id`
    2. FROM `client_bid` a
    3. 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)
    4. WHERE a.`client_bid_blocked` = 'n'
    5. AND b.`client_id` IS NULL
    Прочитал довольно много, но так и не решил для себя - в каких случаях лучше not exits, а в каких - left join ... is null.

    not in у меня сразу отпал, как самый худший.

    План первого запроса:

    Код (Text):
    1. "id"    "select_type"   "table" "type"  "possible_keys" "key"   "key_len"   "ref"   "rows"  "Extra"
    2. "1" "PRIMARY"   "a" "ALL"   \N  \N  \N  \N  "12"    "Using where"
    3. "2" "DEPENDENT SUBQUERY"    "b" "ALL"   \N  \N  \N  \N  "1" "Using where"
    План второго запроса:

    Код (Text):
    1. "id"    "select_type"   "table" "type"  "possible_keys" "key"   "key_len"   "ref"   "rows"  "Extra"
    2. "1" "SIMPLE"    "a" "ALL"   \N  \N  \N  \N  "12"    "Using where"
    3. "1" "SIMPLE"    "b" "ALL"   \N  \N  \N  \N  "1" "Using where; Not exists; Using join buffer (Block Nested Loop)"
    Индексы я пока не применял, меня другое интересует.
     
  2. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    Re: Какой из запросов лучше?, not exist / left join ... is n

    тогда нет смысла сравнивать (;
     
  3. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Re: Какой из запросов лучше?, not exist / left join ... is n

    замерь скорость выполнения
     
  4. lex-romanow

    lex-romanow Активный пользователь

    С нами с:
    24 сен 2014
    Сообщения:
    50
    Симпатии:
    1
    Re: Какой из запросов лучше?, not exist / left join ... is n

    без индексов?

    Добавлено спустя 1 минуту 14 секунд:
    Re: Какой из запросов лучше?, not exist / left join ... is null
    попробую
     
  5. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    Re: Какой из запросов лучше?, not exist / left join ... is n

    да (:)
     
  6. lex-romanow

    lex-romanow Активный пользователь

    С нами с:
    24 сен 2014
    Сообщения:
    50
    Симпатии:
    1
    Re: Какой из запросов лучше?, not exist / left join ... is n

    т.е. нужно смотреть на тот вариант, который с индексами будет работать быстрей и планировщик при этом будет давать верное количество rows, а не предполагаемое?
     
  7. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    Re: Какой из запросов лучше?, not exist / left join ... is n

    совершенно верно ((:) Но с индексами есть свои тонкости, например, при удалении записи (;
     
  8. lex-romanow

    lex-romanow Активный пользователь

    С нами с:
    24 сен 2014
    Сообщения:
    50
    Симпатии:
    1
    Re: Какой из запросов лучше?, not exist / left join ... is n

    какие тонкости?
     
  9. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    Re: Какой из запросов лучше?, not exist / left join ... is n

    лучше будет если ты сам про них прочитаешь в оф. доке (;
     
  10. lex-romanow

    lex-romanow Активный пользователь

    С нами с:
    24 сен 2014
    Сообщения:
    50
    Симпатии:
    1
    Re: Какой из запросов лучше?, not exist / left join ... is n

    ну это несомненно :) но я пока даже намека не пойму, что может быть с удаляемой записью, если ее просто удалить - она просто удалится
     
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.115
    Симпатии:
    1.244
    Адрес:
    там-сям
    Re: Какой из запросов лучше?, not exist / left join ... is n

    Оценивай запросы по такому принципу: оптимальный запрос должен отсекать как можно больше данных как можно раньше. Исходя из этого первый запрос безнадёжно плох. Второй при наличии индексов и, может быть, при некоторых перестановках условий можно заставить перебирать не все данные.
     
  12. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    Re: Какой из запросов лучше?, not exist / left join ... is n

    с записью ничего, а вот с индексами будут (;
     
  13. lex-romanow

    lex-romanow Активный пользователь

    С нами с:
    24 сен 2014
    Сообщения:
    50
    Симпатии:
    1
    Re: Какой из запросов лучше?, not exist / left join ... is n

    то что хотел услышать, спасибо

    Добавлено спустя 1 минуту 14 секунд:
    Re: Какой из запросов лучше?, not exist / left join ... is null
    т.е. при удалении строки где есть индекс на какой-то колонке, таблица будет перестраиваться?
     
  14. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    Re: Какой из запросов лучше?, not exist / left join ... is n

    на сколько я помню из оф. дока - "крошится последовательность" (:)
     
  15. lex-romanow

    lex-romanow Активный пользователь

    С нами с:
    24 сен 2014
    Сообщения:
    50
    Симпатии:
    1
    Re: Какой из запросов лучше?, not exist / left join ... is n

    индексов или первичного автоинкрементного ключа?
     
  16. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    Re: Какой из запросов лучше?, not exist / left join ... is n

    индексов конешь ((:)
     
  17. lex-romanow

    lex-romanow Активный пользователь

    С нами с:
    24 сен 2014
    Сообщения:
    50
    Симпатии:
    1
    Re: Какой из запросов лучше?, not exist / left join ... is n

    возможно это на какой-то определенной версии мускуля? т.к. это же не совсем есть хорошо, должны разработчики исправить

    есть ли варианты избежания этого "крошения" или с этим мирится придется?

    и как понять, что последовательность индексов "покрошилась"? - запросы на выборку, которые работали с этими индексами, будут уже не так работать как до этого?
     
  18. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    Re: Какой из запросов лучше?, not exist / left join ... is n

    это все лечится, через сброс и установки индексов заново, одним запросом ((:)
    иди уже почитай доку - там много чего интересного для себя найдешь (;
     
  19. lex-romanow

    lex-romanow Активный пользователь

    С нами с:
    24 сен 2014
    Сообщения:
    50
    Симпатии:
    1
    Re: Какой из запросов лучше?, not exist / left join ... is n

    да вот гуглю, но мне что-то кажется, что это уже устаревшая инфа или вообще не действительная. как-то не очень правдоподобно, ведь если так и было, то это не маленькая проблема после каждого удаления делать переустановку индексов
     
  20. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    Re: Какой из запросов лучше?, not exist / left join ... is n

    вычитаешь свежую инфу - отпишись ((:) Будет интересно :)
     
  21. lex-romanow

    lex-romanow Активный пользователь

    С нами с:
    24 сен 2014
    Сообщения:
    50
    Симпатии:
    1
    Re: Какой из запросов лучше?, not exist / left join ... is n

    если найду, но мне кажется такая проблема маловероятна или вообще отсутствует
     
  22. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Re: Какой из запросов лучше?, not exist / left join ... is n

    В большинстве случаев join лучше. Очень часто подзапросы переписываются оптимизатором в джойн. Но, конечно, бывают и исключения.
     
  23. lex-romanow

    lex-romanow Активный пользователь

    С нами с:
    24 сен 2014
    Сообщения:
    50
    Симпатии:
    1
    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
    пока что нашел -
     
  24. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    Re: Какой из запросов лучше?, not exist / left join ... is n

    да... это тоже давняя инфа. На хай-лоадерах не сразу делают удаление проиндексированных записей, а во время профилактики сервера ((:)