2016-11-30 2 views
3

У меня есть этот sql-запрос. Теперь я возвращаюсь, но не понимаю, как сервер анализирует и выполняет его шаг за шагом. Я хочу понять принципы работы на глубоком уровне, что происходит на сервере, когда вы запускаете команду sql, как она итерации в каждой строке перед возвратом результата.Что происходит на сервере sql при запуске этой команды sql

enter image description here

У меня есть users и friends таблицу, в последней есть friend_id и user_id комбинации, оба они являются идентификаторами пользователей.

select u.id,f.user_id, f.friend_id from friends f 
    INNER JOIN users u on (u.id = f.friend_id or u.id = f.user_id) 
    where f.user_id = 72 or f.friend_id = 72 
  • Как может объяснить мне, что происходит на каждом шаге этого запроса?
  • Как он ведет себя на каждом шагу?
  • Как OR оператор ведет себя на каждом шагу здесь?
  • Проверяет оба оператора оператора OR на каждом шаге или запрос, или, например, запрос. в первой итерации соединяется с friend_id, затем с user_id.
+1

Было бы целесообразно удалить неправильный тег. Это MySQL или SQL Server? –

+0

Имеет ли MySQL план выполнения, аналогичный SQL Server? –

+0

Я использовал команду EXPLAIN, но это не то, что я ищу, мне нужно понять принципы работы select query. Как это работает или компилируется. –

ответ

2

Без плана запроса я могу только сделать предположение, как двигатель может потенциально выполнить запрос, я надеюсь, что это помогает:

Первый шаг - ОТ:

Если у вас есть индекс на столбцах where (user_id, user_id) поиск индекса может быть выполнен в таблице ваших друзей, где условия для ограничения результатов, которые необходимо оценить позже в плане выполнения. Если у вас нет индекса, можно выполнить сканирование таблицы.

Ваш запрос будет выбрать все строки из таблицы друзей, где user_id или friend_id равно 72.

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

второй шаг - JOIN:

После друзей строки найдены применяя где предикат, фактический присоединиться к обработке заводилась. В зависимости от статистики таблицы и затрат на запрос движок может выполнять объединение вложенных циклов, где каждая строка оценивается от друзей к пользователям. Он также мог бы построить хеш-таблицу для одной таблицы и исследовать каждую строку из другой таблицы с помощью функции хеш-ключа. Таким образом, идентификаторы могут быть сопоставлены между вашими двумя таблицами (друзьями и пользователями)

ON определяет, какие столбцы ему нужно сравнить.

Рассмотрим случай объединения вложенных циклов, которое легче понять. Этот тип соединения проходит через оба потока данных (друзей и пользователей), которые соединяются друг с другом в ряд за строкой и оценивают каждую строку.

В вашем запросе будет сравниваться u.id с friend_id. Если это условие вернёт true, соединение будет выполнено, и двигатель будет комбинировать соответствующую строку из друзей и пользователей таблицы для дальнейшей обработки.Если первое условие ON ложно или неизвестно, движок будет оценивать второе условие user_id. True выполняет соединение, ложное или неизвестное означает, что строка не сопоставляется, поэтому она не будет возвращена, так как в этом случае оба условия будут терпеть неудачу.

третьего шага - SELECT:

После таблицы соединяется двигатель имеет все данные, он должен, наконец, выполнить SELECT о возвращающихся столбцах вы просили его.

Смежные вопросы