트리구조 0 12 639

by 날아라! [MySQL] [2019.02.13 09:30:45]


안녕하세요. 오늘도 고수님들께 도움받고자 문의드립니다 ㅡㅡ

 

현재 mysql를 이용중에 있는데요.

category_tbl 이 디비내에 존재합니다.

해당컬럼수는 4000개 정도되는데요.

해당데이터를 트리구조형태로 현재 로직을 구성하고있는데 막상노출을 하게되면 속도가 현저히 떨어지네요.

아래구조처럼 1차, 2차, 3차 형태로 구성이 되어있습니다.

1차카테고리명 (2차자식카테고리 개수)

└ 2차카테고리명 (3차 자식카테고리 개수)

    └ 3차카테고리명

   작은지식으로 로직을 구성하다보니 WHILE을 계속사용하게되어 해당문제때문에 속도가 떨어지고있는듯합니다.

   아래는 로직을 구성한 소스형태인데요. 필요한 인덱스는 모두 잡아놨는데요

  고수님들의 진심어린 충고좀 부탁드립니다. ㅡㅡ 질문이 좀 어수선하네요.

SELECT code
     , cname
     , depth
     , prior1
     , prior2
     , prior3
  FROM category_tbl
 WHERE code != '00' 
   and depth > 0 
 order by depth asc, prior1 asc, prior2 asc, prior3 asc
..
 while {

    SELECT count(code) as depth02_cnt FROM category_tbl WHERE code like '01%' and depth=2";
 
    ..
    ..

    SELECT code
         , cname
         , depth
         , prior1
         , prior2
      FROM category_tbl
     WHERE code != '01' 
       and depth > 0 
       and depth = 2
     order by depth asc, prior1 asc, prior2 asc

     ..

     while {
    
        SELECT count(code) as depth02_cnt FROM category_tbl WHERE code like '02%' and depth=3";

    }

}
 

 

   

by 마농 [2019.02.13 09:43:10]

컬럼수가 4000개라고요? 로우수를 잘못 말한거죠?
질문의 소스 형태가 실제 소스가 맞나요?
위 형태라면? while 을 왜 돌리는지 모르겠네요?
실제 소스와 유사하게 표현해 주세요. 중요부분 빼지 마시구요.
code 조건 '00', '01', '02' 등은 뭘 의미하나요?
샘플 데이터를 볼 수 있을까요?


by 날아라! [2019.02.13 09:51:40]

아..죄송합니다. 급하게 쓰다보니 로우수입니다. ㅡㅡ

code는 카테고리 코드입니다

샘플데이터는 아래와같습니다.

code name count
01 aa 5
0101 aa_1 3
010101 aa_1_1 0
010102 aa_1_2 0
010103 aa_1_3 0
0102 aa_2 0
0103 aa_3 0
0104 aa_4 0
0105 aa_5 0

 

아래처럼 변경을 해봤는데..count가 계속 0 이나오네요 ㅡㅡ

SELECT code,name
     , (SELECT COUNT(*) FROM category_tbl WHERE code=brd.codeAND depth=2) AS count 
  FROM category_tbl  AS brd
   WHERE brd.depth = 1
 ORDER BY brd.code

 


by 마농 [2019.02.13 09:54:42]

샘플에 depth 와 prior1, 2, 3 값도 보여주세요.
code 조건 '00', '01', '02' 등은 뭘 의미하나요?


by 날아라! [2019.02.13 10:13:39]

관심가져주셔서 감사합니다.

code는 생성된 카테고리 코드입니다.

그리고 prior은 생성된 카테고리 우선순위입니다.

  생성된 카테고리코드 name count depth prior1 prior2 prior3
1차 01 aa 5 1 1 0 0
2차 0101 aa_1 3 2 1 1 0
3차 010101 aa_1_1 0 2 1 2 0
3차 010102 aa_1_2 0 2 1 3 0
3차 010103 aa_1_3 0 2 1 4 0
2차 0102 aa_2 0 3 2 2 0
2차 0103 aa_3 0 4 3 3 0
2차 0104 aa_4 0 5 4 4 0
2차 0105 aa_5 0 6 5 5 0

by 마농 [2019.02.13 10:21:29]

depth, prior1, 2, 3 등의 값이 이상하네요?
3차라고 표현한 코드의 depth 가 3 이 되어야 하는것 아닌가요?
prior1 이 1차의 순위를 뜻하는거 아닌가요?
정보가 부족하여 샘플자료를 보고 판단하려고 하는데
샘플을 이상하게 주시면 더 헷갈리게 되네요.


by 날아라! [2019.02.13 10:28:13]

죄송합니다. 제가 잘못등록했네요 ㅡㅡ

  생성된 카테고리코드 name count depth prior1 prior2 prior3
1차 01 aa 5 1 1 0 0
2차 0101 aa_1 3 2 1 1 0
3차 010101 aa_1_1 0 3 1 1 1
3차 010102 aa_1_2 0 3 1 1 2
3차 010103 aa_1_3 0 3 1 1 3
2차 0102 aa_2 0 2 1 2 0
2차 0103 aa_3 0 2 1 3 0
2차 0104 aa_4 0 2 1 4 0
2차 0105 aa_5 0 2 1 5 0

by 마농 [2019.02.13 10:31:59]
WITH category_tbl AS
(
SELECT '01' code, 'aa' name, 1 depth, 1 prior1, 0 prior2, 0 prior3
UNION ALL SELECT '0101'  , 'aa_1'  , 2, 1, 2, 0
UNION ALL SELECT '010101', 'aa_1_1', 3, 1, 2, 1
UNION ALL SELECT '010102', 'aa_1_2', 3, 1, 2, 2
UNION ALL SELECT '010103', 'aa_1_3', 3, 1, 2, 3
UNION ALL SELECT '0102'  , 'aa_2'  , 2, 1, 1, 0
UNION ALL SELECT '0103'  , 'aa_3'  , 2, 1, 3, 0
UNION ALL SELECT '0104'  , 'aa_4'  , 2, 1, 4, 0
UNION ALL SELECT '0105'  , 'aa_5'  , 2, 1, 5, 0
UNION ALL SELECT '02'    , 'bb_1'  , 1, 2, 0, 0
UNION ALL SELECT '0201'  , 'bb_1'  , 2, 2, 1, 0
UNION ALL SELECT '020101', 'bb_1_1', 3, 2, 1, 1
)
SELECT code
     , name
     , depth
     , prior1
     , prior2
     , prior3
     , (SELECT COUNT(*)
          FROM category_tbl
         WHERE code LIKE CONCAT(brd.code, '__')
           AND depth = brd.depth + 1
        ) AS cnt
  FROM category_tbl brd
 ORDER BY prior1, prior2, prior3
;

 


by 날아라! [2019.02.13 10:43:59]

답변감사합니다. 한가지만 여쭐께요

적어주신내용에서 code LIKE CONCAT(brd.code, '__') 

윗 부분은 어떤걸 뜻하는지 알수있을까요?


by 마농 [2019.02.13 10:50:58]

예를 들면 부모 code 가 '01' 인 경우
 WHERE code LIKE '01__' 으로 자식을 찾죠.
그려면 '0101, '0102, '0103', '0104', '0105' 5개를 찾게 되는 거네요.
LIKE 에서 사용되는 와일드카드 표시입니다. % 는 여러문자, _ 는 1개 문자


by 날아라! [2019.02.13 10:53:26]

답변감사합니다.

그런데 cnt가 0으로 나오네요 ㅡㅡ


by 마농 [2019.02.13 10:55:30]

위의 with 문의 샘플 자료로 실제로 테스트 한 내용입니다.
 - 질문의 내용이 실제와 다르거나.
 - 적용 쿼리가 답변 쿼리와 다르거나.


by 날아라! [2019.02.13 10:57:58]

넵..감사합니다...많은도움되었습니다.^^

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