@UNy

Как работает Exists?

Уже бошка едет от Exists. Есть такой запрос:
SELECT *
FROM authors
WHERE EXISTS (SELECT * FROM m2m_books_authors 
                  WHERE authors.a_id=m2m_books_authors.a_id)

Ясно что он выведет всё из таблицы авторы где authors.a_id=m2m_books_authors.a_id.
Меня подробно интересует как это всё будет работать. Я представляю так :
Берем запись из authors в exists смотрим есть ли в нем запись с таким же id как и id authors, если есть возвращаем true и вуаля запись помещается в основную выборку.
Если я не прав пожалуйста опишите детально процесс взаимодействия запроса и подзапроса в Exists.
  • Вопрос задан
  • 1036 просмотров
Решения вопроса 1
@UNy Автор вопроса
В общем нашел подробное объяснение тут https://stackoverflow.com/questions/5846882/how-do...

Если по русски: для строки из внешнего запроса проверяется существует ли строка в подзапросе, которая соответствует условию( в подзапросе). Когда найдется подходящая строка условие where exists будет удовлетворено для это строки и строка попадет в основную выборку.
Подзапрос выполняется для каждой строки таблицы внешнего запроса.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
ApeCoder
@ApeCoder
Я думаю, это зависит от того, какие индексы и какая статистика есть по таблицам. Задача аналогична алгоритмам соединения

Например, если есть индексы по полям проще обойти все записи в той таблице, в которой их меньше по возрастанию индекса, при этом двигаться по иднексу в большей таблице и подбирать записи оттуда (подтробнее - см соединение слиянием).

Какой конкретно алгоритм выбран, покажет команда EXPLAIN или инструмент Visual Explain в MYSQL Workbench
Ответ написан
@d-stream
Готовые решения - не подаю, но...
Вероятнее всего планировщик сообразит и построит inner join, но не исключено что у него на это не хватит интеллекта и запрос будет тупить...
Посему будет гораздо честнее писать inner join
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы