Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Два join
Форумы портала PHP.SU » » Работа с СУБД » Два join

Страниц (1): [1]
 

1. Еугений - 14 Октября, 2015 - 14:23:32 - перейти к сообщению
Делаю новую страницу на своём сайте для
пользователей, так получается что там будет
запрос с двумя join (вот
набросок,упрощённый, без where):
SELECT *
FROM t1
LEFT JOIN t2 ON t1.post_id = t2.post_id
INNER JOIN t3 ON t2.post_id = t3.id

Таблицы t1 и t2 очень малы, несколько КБ, три
столбца в каждом и все integer. А вот t3
внушительна, растёт каждый день.

Я не разбираюсь в запросах, и вообще в
mysql.. Но знаю что джоины нехило могут
грузить сервер, и не рекомендуется их
выполнять на частозаходимых страницах, что
я хочу сделать

Как работает этот запрос с точки зрения БД?
Мне кажется так: сначала t1 left join t2 найдёт
необходимые id-шники, их будет немного,
0-100 штук, а уж только потом mysql
возьмется за t3. Если mysql начнёт перебирать
t3 в последнюю очередь, с готовыми id-
шками, то запрос будет не таким уж
серьёзным. Так ведь?

Или mysql в каждом своем цикле работает
сразу со всеми тремя таблицами? Если это
так то я лучше переделаю запрос на
select * from t3 where id in(select t2.post_id from
t1 left join t2 on..)
2. Мелкий - 14 Октября, 2015 - 14:45:15 - перейти к сообщению
Еугений пишет:
Как работает этот запрос с точки зрения БД?

Как пожелает планировщик.
explain analyze покажет его мысли по этому поводу.

Даже для странного mysql, который джойнить умеет только самым примитивным inner loop'ом, приджойнить пяток таблиц по индексам не является проблемой.

 

Powered by ExBB FM 1.0 RC1