2017-12-20 12 views
0

내 쿼리를 실행할 분 정도 걸립니다 쿼리, 그것은MySQL의 쿼리 최적화 또는 단축 내가이 쿼리를 단축 할 수있는 방법

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)) 
+0

테이블 구조를 제공하고 달성하려는 것을 설명하십시오. – Bentaye

+0

물론 .. .. 테이블 구조를 제공합니다 .. 데이터를 가져 오는 데 10 분 이상 걸립니다 – dude

+0

Grrrrrr ... 쿼리가 어떤 테이블'j_id '가 있는지를 알려주지 않으므로 당신을 도우려는 것이 어렵습니다. 'SHOW CREATE TABLE'. –

답변

1

가 비효율적

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) 

(이 시점에서, 나는이 무엇 테이블 j_id 말할 수 없기 때문에 펀트!)

DISTINCT(col_name), DISTINCT는 함수가 아닙니다 말하지 말라가, 따라 모든 열/표현에 적용 . 그것은 귀하의 경우에는 문제가되지 않지만

SELECT DISTINCT(a), b FROM ... 

SELECT DISTINCT a, b FROM ... 

과 동일하고 a,b의 쌍 해제 dupped되어야한다고 말한다.