Мой запрос занимает несколько минут для запуска, как я могу сократить этот запрос и сделать его быстрее
SELECT *
FROM
(
SELECT distinct(ja.applied_recruiter_id) as r_ids
FROM ('game_applied' AS ja)
JOIN 'games_post' AS jp ON 'jp'.'id' = 'ja'.'game_post_id'
JOIN 'user_user' AS uu ON 'uu'.'id' = 'ja'.'applied_recruiter_id'
WHERE 'ja'.'game_post_id' = j_id
AND 'uu'.'user_member_type_id' = 2
AND 'jp'.'status' NOT IN ('3', '6', '7')
UNION
SELECT distinct(jr.referby_user_id) as r_ids
FROM ('game_refer' AS jr)
JOIN 'games_post' AS jp ON 'jp'.'id' = 'jr'.'game_id'
JOIN 'user_user' AS uu ON 'uu'.'id' = 'jr'.'referby_user_id'
WHERE 'jr'.'game_id' = j_id
AND 'uu'.'user_member_type_id' = 2
AND 'jp'.'status' NOT IN ('3', '6', '7')
UNION
SELECT distinct(js.referrer_id) as r_ids
FROM ('game_share_log' AS js)
JOIN 'games_post' AS jp ON 'jp'.'id' = 'js'.'game_id'
JOIN 'user_user' AS uu ON 'uu'.'id' = 'js'.'referrer_id'
WHERE 'js'.'game_id' = j_id
AND 'uu'.'user_member_type_id' = 2
AND 'jp'.'status' NOT IN ('3', '6', '7')
UNION
SELECT distinct(uf.user_user_id) as r_ids
FROM ('user_follow_company' AS uf)
JOIN 'user_user' AS uu ON 'uu'.'id' = 'uf'.'user_user_id'
WHERE 'uf'.'gamer_company_id' = c_id
AND 'uu'.'user_member_type_id' = 2
UNION
SELECT distinct(rj.user_id) as r_ids
FROM ('recruiter_game_views' AS rj)
JOIN 'games_post' AS jp ON 'jp'.'id' = 'rj'.'game_id'
JOIN 'user_user' AS uu ON 'uu'.'id' = 'rj'.'user_id'
WHERE 'rj'.'game_id' = j_id
AND 'uu'.'user_member_type_id' = 2
AND 'jp'.'status' NOT IN ('3', '6', '7')
UNION
SELECT distinct('jf'.'user_id') as r_ids
FROM ('games_favourite' AS 'jf')
JOIN 'games_post' AS 'jp' ON 'jp'.'id' = 'jf'.'game_post_id'
JOIN 'user_user' AS 'uu' ON 'uu'.'id' = 'jf'.'user_id'
WHERE 'jf'.'game_post_id' = j_id
AND 'uu'.'user_member_type_id' = 2 AND 'jf'.'game_favourite_status' = '1'
AND 'jp'.'status' NOT IN ('3', '6', '7')
UNION
SELECT distinct ('jiu'.'user_id') as r_ids
FROM ('game_insight_user' AS 'jiu')
JOIN 'game_insight' AS 'ji' ON 'ji'.'id' = 'jiu'.'insight_id'
WHERE 'ji'.'game_post_id' = j_id
) AS r_ids
WHERE r_ids not in ( SELECT referby_user_id FROM game_refer_to_member jrm1 JOIN game_refer jr ON jrm1.rid = jr.id JOIN user_socialconnections AS ruef ON (jrm1.referto_addressbookid = ruef.id) JOIN user_user AS eu1 ON jr.referby_user_id = eu1.id WHERE 1=1 AND jrm1.id in (select DISTINCT(referred_by) as referred_by from game_applied where game_post_id = j_id ))
Избавиться от неэффективности
AND jrm1.id in (
SELECT DISTINCT(referred_by) as referred_by
from game_applied
where game_post_id = j_id )
Замените его
AND NOT EXISTS ( SELECT 1 FROM game_applied
WHERE game_post_id = j_id
AND jrm1.id = referred_by )
Добавить составные индексы:
uu: INDEX(user_member_type_id, id)
jr: INDEX(referby_user_id, game_id)
js: INDEX(referrer_id, game_id)
(etc for the other variants)
(В этот момент я punt, так как не могу сказать, в какой таблице находится j_id!)
Не говорите DISTINCT(col_name)
, DISTINCT
не является функцией, применяется ко всем столбцам/выражениям, которые следуют. Это не имеет значения в вашем случае, но
SELECT DISTINCT(a), b FROM ...
такой же как
SELECT DISTINCT a, b FROM ...
и он говорит, что пары a,b
должны быть деактивированы.