Без плана запроса я могу только сделать предположение, как двигатель может потенциально выполнить запрос, я надеюсь, что это помогает:
Первый шаг - ОТ:
Если у вас есть индекс на столбцах where (user_id, user_id) поиск индекса может быть выполнен в таблице ваших друзей, где условия для ограничения результатов, которые необходимо оценить позже в плане выполнения. Если у вас нет индекса, можно выполнить сканирование таблицы.
Ваш запрос будет выбрать все строки из таблицы друзей, где user_id или friend_id равно 72.
OR
здесь означает, что только одно условие должно быть верно и для строк, которые будут добавлены в поток данных строк от друзей.
второй шаг - JOIN:
После друзей строки найдены применяя где предикат, фактический присоединиться к обработке заводилась. В зависимости от статистики таблицы и затрат на запрос движок может выполнять объединение вложенных циклов, где каждая строка оценивается от друзей к пользователям. Он также мог бы построить хеш-таблицу для одной таблицы и исследовать каждую строку из другой таблицы с помощью функции хеш-ключа. Таким образом, идентификаторы могут быть сопоставлены между вашими двумя таблицами (друзьями и пользователями)
ON
определяет, какие столбцы ему нужно сравнить.
Рассмотрим случай объединения вложенных циклов, которое легче понять. Этот тип соединения проходит через оба потока данных (друзей и пользователей), которые соединяются друг с другом в ряд за строкой и оценивают каждую строку.
В вашем запросе будет сравниваться u.id с friend_id. Если это условие вернёт true, соединение будет выполнено, и двигатель будет комбинировать соответствующую строку из друзей и пользователей таблицы для дальнейшей обработки.Если первое условие ON ложно или неизвестно, движок будет оценивать второе условие user_id. True выполняет соединение, ложное или неизвестное означает, что строка не сопоставляется, поэтому она не будет возвращена, так как в этом случае оба условия будут терпеть неудачу.
третьего шага - SELECT:
После таблицы соединяется двигатель имеет все данные, он должен, наконец, выполнить SELECT
о возвращающихся столбцах вы просили его.
Было бы целесообразно удалить неправильный тег. Это MySQL или SQL Server? –
Имеет ли MySQL план выполнения, аналогичный SQL Server? –
Я использовал команду EXPLAIN, но это не то, что я ищу, мне нужно понять принципы работы select query. Как это работает или компилируется. –