Какой запрос больше грузит сервер ?

Vladson

Сильнобухер
Какой запрос больше грузит сервер ?

А вот у меня такой вопрос, на счёт загрузки SQL сервера, (MySQL 4.1.9+Win2k)

Что его больше грузит, запрос типа

Код:
SELECT t1.name, t3.id_3
   FROM table1 t1, table2 t2, table3 t3
   WHERE t1.id_1 = t2.id_1
      AND t2.id_2 = t3.id_2
или

Код:
SELECT t1.name, t3.id_3
   FROM table1 t1
   LEFT JOIN table2 t2 ON t2.id_1 = t1.id_1
   LEFT JOIN table3 t3 ON t3.id_2 = t2.id_2
С практической точки зрения они почти одинаковые (за исключением некоторых мелочей) а вот что на счёт загрузки сервера ?
(Это в том случае если предположим у меня мега портал с милионом посетителей ежедневно, а SQL сервер на 486-м проце :D )
 

Romantik

TeaM PHPClub
Это в том случае если предположим у меня мега портал с милионом посетителей ежедневно, а SQL сервер на 486-м проце
В этом случае уже безразлично какой из =)
А проверить элементарно можешь и сам, к примеру замеряя время до и после запроса =)
 

Vladson

Сильнобухер
В том то и дело что проверка времени даёт почти одинаковые результаты, но я хочу знать в теории какая разница
(просто если как я сказал млн пользователей то прирост даже в 0.01% будет оправдан) а отследить это на практике я не имею возможности, может кто-то что-то про это читал или даже проверял...
( а про SQL сервер на 486-м проце это я утрировал конечно :D )
 

yugene

Отошел от дел
Originally posted by Vladson
отследить это на практике я не имею возможности
Почему? Можно замерять время выполнения, запуская этот запрос не один раз, а, скажем, 10000. Погрешность измерений уменьшится...
 

neko

tеam neko
а вам не кажется что это разные запросы?
т.е. они дадут разный результат для начала
 

ForJest

- свежая кровь
Vladson
Вопрос не теоретический явно. А скорее практический. Все теоретический ответы изложены в мане.
http://dev.mysql.com/doc/mysql/ru/where-optimisations.html
http://dev.mysql.com/doc/mysql/ru/left-join-optimisation.html

С практической точки зрения нет смысла в этой гипотетической ситуации.
 

Wicked

Новичок
1) да, эти запросы разные, и (как правило) дадут разное количество записей в рез-те, и это скажется на времени работы.

2) имхо нету особого смысла до такой степени зализывать все запросы - наверняка есть места, в которых можно добиться более эффективной оптимизации.

вот скажи, к примеру, у тебя есть такие индексы:
* `ix_1` (`id_1`, `id_2`) в таблице `table_2` (и/или `ix_2` (`id_2`, `id_1`))
* `ix_3` (`id_2`, `id_3`) в таблице `table_3`
* `ix_4` (`id_2`, `name`) в таблице `table_1`
(в порядке убывания значимости)
?
если нету, то добавление некоторых (нужно тестить, каких именно) могло бы неслабо помочь...
 

Wicked

Новичок
чтобы узнать, что быстрее: left join, или = (которое олицетворяет здесь inner join) :)

согласен, это лажа какая-то :)
 

neko

tеam neko
я считаю что пока еще не закрыт вопрос с китом и слоном, тратить время на подобные обсуждения чистой воды безрассудство
 

Vladson

Сильнобухер
1) да, эти запросы разные, и (как правило) дадут разное количество записей в рез-те, и это скажется на времени работы.
В том случае где эти запросы использую я (при условии целосности базы) эти запросы не эквивалентны а аналогичны и мне в моём случае всё равно какой использовать
2) имхо нету особого смысла до такой степени зализывать все запросы - наверняка есть места, в которых можно добиться более эффективной оптимизации.
Я тоже всегда так говорю, но сейчас мне нужно именно это
Можно замерять время выполнения, запуская этот запрос не один раз, а, скажем, 10000. Погрешность измерений уменьшится...
Пожалуй так и попробую сделать
(до сих пор не сделал потаму что думал может кто точно знает как и что)
 

ONK

Пассивист PHPСluba
Если структура базы данных и хранимые данные предпологают, что оба запроса дают аналогичные результат, то первый запрос будет работать ~ на 10 - 15% быстрее.
 

Vladson

Сильнобухер
Опытным путём удалось выяснить, что
(при структуре базы с которой они дают одинаковый результат)

первый запрос грузит сервак меньше при "лёгких" запросах
Код:
SELECT *
	FROM phpb_posts p
	LEFT JOIN phpbb_users u ON u.user_id = p.poster_id
	LIMIT 0, 10
второй при "тяжёлых"
Код:
SELECT *
	FROM phpb_posts p, phpbb_users u
	WHERE u.user_id = p.poster_id
	LIMIT 0, 1000
Разница колеблится от 5 до 25 процентов, но никогда (среднестатистически) небыло разницы ниже 5 процентов

Спасибо конечно за то что выслушали, но я ожидал всё же что кто нибудь это знал бы и рассказал бы до того как я попробую...
 

Wicked

Новичок
Vladson, на кой тебе сдался этот LEFT?
это заставляет MySQL думать, что ему нужно еще выбирать записи, соответствующие части которых отсутствуют в `phpbb_users`. И имхо это, даже если таких записей не нашлось, это все равно тормозит работу.
 

Vladson

Сильнобухер
Vladson, на кой тебе сдался этот LEFT?
Он есть и он работает что ещё надо
И имхо это, даже если таких записей не нашлось
В том то и дело что в моих случаях эти записи найдутся,
а если не найдутся то я об этом узнаю
потаму что будут глюки с отображением контента
так как для странички нужны оба этих параметра
с LEFT phpb_posts будет в списке результатов а phpbb_users нет,
и таким образом я узнаю что база битая и среагирую сразу
а в случае без него (MySQL ненёдёт соответствие u.user_id = p.poster_id)
и просто не отобразятся эти записи
a я буду думать что их там и небыло

Более того опытным путём доказано
что при маленьких запросах работает LEFT быстрее
 
Сверху