안녕하세요. 오늘도 고수님들께 도움받고자 문의드립니다 ㅡㅡ
현재 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";
}
}
아..죄송합니다. 급하게 쓰다보니 로우수입니다. ㅡㅡ
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
관심가져주셔서 감사합니다.
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 |
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 ;