Slow Query

DownFall

Registered
Код:
SELECT SQL_CACHE
		`msg`.`msg_id`,
		`msg`.`t_id`,
		`t`.`b_id`,
		`t`.`t_replies`,
		`t`.`t_views`,
		`msg`.`msg_ctime`,
		`msg`.`msg_author_id`,
		`t`.`t_name`,
		`t`.`t_description`,
		`t`.`t_is_sticky`,
		`t`.`t_author_id`,
		`t`.`t_last_poster_id`,
		`t`.`t_replies`,
		`t`.`t_views`,
		`t`.`t_is_locked`,
		`u`.`u_display_name`  AS `t_author_name`,
		`g_id` AS `t_author_g_id`,
		(SELECT `g_id` FROM `forum`.`users` WHERE `u_id` = `msg`.`msg_author_id` LIMIT 1) AS `msg_last_poster_g_id`
		FROM `forum`.`messages` AS `msg`
		LEFT JOIN `forum`.`topics` AS `t` ON `msg`.`t_id` = `t`.`t_id`
		LEFT JOIN `forum`.`users` AS `u` ON `t`.`t_author_id` = `u`.`u_id`
	WHERE
			`t`.`b_id` != 30
		AND
			`msg`.`msg_ctime` > 1334610000
		AND
			`msg`.`msg_author_id` != 6344
		AND
			`t`.`t_id` NOT IN (SELECT SQL_CACHE `LR`.`t_id` FROM `forum`.`log_read` as `LR` WHERE `LR`.`u_id` = 6344)

Ето примерна заявка.. Цялата заявка ми забавя значително системата..
Общо взето, чрез тази заявка извличам непрочетени публикации от преглеждащия. Можете ли да ми предложите някаква оптимизация на заявката или единствения вариант е кеширане?
 
Като за начало махни тея вложени заявки, само отежняваш положението. Вместо първата заявка може да направиш един INNER JOIN.
 
Готово, но разликата е почти никаква. Явно не е от тук забавянето.. Други предложения?
 
Премахан ли и другата вложена заявка ? Силно вероятно е точно тя да ти прави забавянето.
 
NewGuy каза:
LEFT JOIN бави. Особено ако имаш INNER JOIN и после LEFT JOIN.
Само LJ използвам. Предполагам, че си оказва влияние на скоростта, но ми е нужна информацията от всичките таблици. Какъв друг вариант имам освен с join-овете да извлека данните, който да се отрази благоприятно на скоростта?
 
Ако можеш да махнеш LEFT JOIN-овете и да ги замениш с INNER това е най-добрия вариант но предполагам, че не целиш точно това.

Вложените заявки не бавят толкова много особено както в случая селектираш 1 поле от базата или пък броиш резултати.

Можеш ли да дадеш структура на таблиците с няколко записа за да може да го тестваме локално?
 
StormBreaker каза:
Сложи индекси на полетата, които ползваш в WHERE
Направил съм го вече. Въпреки това, доста ми бави заявката, докато я кешира. Най-вероятно е заради повечкото записи в таблиците, но все пак имам желание да я пооптимизирам малко.
 
DownFall каза:
StormBreaker каза:
Сложи индекси на полетата, които ползваш в WHERE
Направил съм го вече. Въпреки това, доста ми бави заявката, докато я кешира. Най-вероятно е заради повечкото записи в таблиците, но все пак имам желание да я пооптимизирам малко.

Тогава си кеширай резултата от заявката за определено време или по друг критерий
 

Back
Горе