mysql 계층형 재귀쿼리 질문좀 드립니다. 0 2 1,247

by 우바마 [MySQL] 계층형 재귀 추천인 계보도 [2020.06.25 02:55:46]


결과.JPG (16,496Bytes)

안녕하세요 

mysql에서 계층형 쿼리를 짜고있는데요..

일단 가장 일반적인 CTE 재귀로 원하는 값을  얻긴했습니다. 

하지만 초기에는 회원 Table의 적은 ROW여서 문제가 없었지만

테스트로 7만 Row정도를 강제 Insert하고 테스트를 하니.. 너무 오래 걸려서 사용할수가 없을정도네요

코드한번 올려봅니다 조언 부탁드리겠습니다. 

테이블구조는 간단합니다. 

user 테이블이 존재하고 

user_id , referral_code(추천인 아이디), user_name 입니다. 

[테이블 데이터]

'test' , '' , '테스트'

'red', 'test', '빨강'

'blue', 'red', '블루'

'green', 'red', '초록'

 

[결과]

lvl , user_id , referral_code

1     test  

2     red         test

3     blue       red

3     green     red

 

나를 기준으로 하위의 추천인들이 레벨별로 나오고있습니다.

아래는 쿼리입니다.

[SQL 쿼리]

WITH RECURSIVE CTE AS (
    SELECT
        user_id,
        referral_code,
        1 AS 'lvl',
		user_name
    FROM user
    WHERE user_uuid = ?
    UNION ALL
    SELECT
        a.user_id,
        a.referral_code,
        lvl + 1 AS 'lvl',
		a.user_name
    FROM user a
    INNER JOIN CTE b ON a.referral_code = b.user_id
    )
   SELECT lvl, user_id, referral_code, user_name FROM CTE;

 

당연히 로우가 많아질수록 성능에 문제가 있을수밖에 없다는건 알고있습니다.

하지만 어떻게 하면 더 효율적인지 많은 고수분들께 질문드립니다. 

아니면.. 10대 추천인까지만 조회 등의 임시방편도 괜찮을것 같습니다.

 

감사합니다.

by 마농 [2020.06.25 08:34:12]

적절한 인덱스가 존재하는지?
유니온 상단 쿼리에서는 user_uuid 인덱스가 필요하고
유니온 하단 쿼리에서는 referral_code 인덱스가 필요할 듯 합니다.
결합인덱스로 만들면 더 좋을 듯 하네요. (referral_code, user_id, user_name)
알리아스에 홑따옴표는 표준에 어긋나니 쌍따옴표로 바꾸거나 아예 빼버리거나 하세요.


by 우바마 [2020.06.25 12:33:09]

감사합니다.

index를 걸어두긴했었는데 제대로 안타고있었네요

다시한번 인덱스의 소중함을 느꼈네요!!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입