Mysql Mysql join'ы

Vano

Новичок
Как выполняются джойны? Нужно понять чтобы экономить на выборках.
1. Джойну плевать на критерий выборки - его задача сцепить таблицы. То-есть сначала создается новая таблица, а уже потом по этой таблице идет выборка.
2. При использовании (к примеру) лефт джойна, сначала выбираются записи по критерию из первой таблицы... хммм, а тут вроде и становится понятно, что работает по первому варианту, так как нужна же выборка по критерию и со второй таблицы.

Так все же как работает джойн?
 

Vano

Новичок
что работает по первому варианту, так как нужна же выборка по критерию и со второй таблицы
Но хотя,
2. Выбираются сначала записи по критерию из первой таблицы, потом к ним присоеденяются записи второй таблицы, и в скрепленной таблице делается запрос по критерию второй таблицы.

Вроде экономно
 

Vano

Новичок
Нашел в документации такое:
RIGHT JOIN реализован аналогично LEFT JOIN.
А про LEFT JOIN пишут такое :
Выражение "A LEFT JOIN B" в MySQL реализовано следующим образом:
...
  • Таблица B устанавливается как зависимая от таблицы A и от всех таблиц, от которых зависит A.
  • ....
  • Выполняются все стандартные способы оптимизации соединения, за исключением того, что таблица всегда читается после всех таблиц, от которых она зависит.
Получается таблица А используя LEFT JOIN будет читаться первой, но и в запросе "A RIGHT JOIN B" таблица А все равно будет читаться первой.
Поэтому:
Код:
SELECT * FROM
    t1 RIGHT JOIN t2
    USING (blah_id)
будет выполнятся с такой же скоростью что и запрос:
Код:
SELECT * FROM
    t1 LEFT JOIN t2
    USING (blah_id)
    WHERE t2.blah_id IS NOT NULL
Я правильно понял?
 

Vano

Новичок
Большое спасибо. Помогло вместе с использованием STRAIGHT JOIN

То-есть хотите понять как работают ДЖОЙНы используйте:
Код:
EXPLAIN EXTENDED SELECT STRAIGHT_JOIN * FROM blablalba LEFT bla bla RIGHT blabla
где STRAIGHT_JOIN означает выключить оптимизацию МайСКЛ и джойнить строго по вашему коду.
Тут можна увидеть: какие таблицы читаются первыми, используются ли индексы в колонках которые в условии запроса, и количество просмотревших записей определенной таблицы(тоесть если у вас 1000 просмотревших записей, а в результате запроса всего-лишь 5, скорее всего что-то неправильно).
 
Сверху