쿼리속도 조언 0 6 936

by 호야별리 [SQL Query] [2021.12.16 08:55:58]


-- mysql

안녕하세요.

늘상 이곳에서 도움만 받는 별리 입니다.

 

쿼리문 구성중 속도가 느린문제점이 있는데 무엇을 잘못한것인지 알수가 없어 조언좀 구하려고 합니다.

쿼리내용은 쇼핑몰 카테고리 입니다.

 

SELECT cate_code
	 , cate_name
	 , depth
	 , prior01
	 , prior02
	 , prior03
	 , prior04
	 , (SELECT COUNT(*)                 -- 하위카테고리 개수구함
		  FROM category
		 WHERE cate_code LIKE CONCAT(SUBSTRING_INDEX(brd.cate_code, 0, 5), '%')
		   AND depth = brd.depth + 1
		) AS cnt
  FROM category brd
  WHERE depth='1'
 ORDER BY prior01, prior02, prior03, prior04

 

현재 등록된 카테고리수는 총340개 입니다.

카테고리구성은 총 4차카테고리 이구요.

인덱스는 잡혀있습니다.

자기자신을 포함한 하위카테고리의 개수를 구하고 싶은데. 해당부분에서 지연이 되는것 같습니다.

cate_code 자릿수는 총20자리입니다.

데이터가 많지도 않은데 왜 느린것인지 조언좀 부탁드립니다.

 

감사합니다.^^

by 모래가흙흙 [2021.12.16 09:57:32]

혹시 인덱스구성이 어떻게 되어있는지 전부 알려주실 수 있나요?


by 호야별리 [2021.12.16 09:59:56]

답변감사합니다.

cate_code 프리마리키

인덱스는 prior01, prior02., prior03, prior04

이렇게 잡혀있습니다.^^

 


by 동동동 [2021.12.16 11:37:22]

depth 는 인덱스가 없나요?

depth 인덱스가 없다면 추가가 필요해 보입니다.


by 호야별리 [2021.12.16 12:39:11]

아...죄송합니다. depth도 인덱스네요^^


by 마농 [2021.12.16 14:26:37]

건수가 적어 느릴 이유가 없어 보이는데요? 혹시 340건이 전체 건수가 아닌 1레벨 건수인가요?
서브쿼리 조건이 PK 조건이라 인덱스도 잘 탈 듯 한데요?
일단은 쿼리가 이상합니다.
서브쿼리 비교식에 엉뚱한 함수가 사용되었네요?
우선 substring_index 부분 빼세요.
2 레벨 건수만 가저오면 될 듯 하니 '%' 대신 '_____' 로 바꿔보세요.
(코드가 레벨당 5자리씩 차지한다고 가정)
cate_code LIKE CONCAT(brd.cate_code, '_____')

샘플자료 보여주세요.
prior01, prior02, prior03, prior04 를 합친 형태가 cate_code 가 되는 건가요?


by 마농 [2021.12.16 15:54:40]
-- 1. 조인으로 풀기 --
SELECT m.cate_code
     , m.cate_name
     , m.depth
     , m.prior01
     , m.prior02
     , m.prior03
     , m.prior04
     , COUNT(s.cate_code) AS cnt
  FROM category m
  LEFT OUTER JOIN category s
    ON s.cate_code LIKE CONCAT(m.cate_code, '_____')
   AND s.depth = '2'
 WHERE m.depth = '1'
 GROUP BY m.cate_code
     , m.cate_name
     , m.depth
     , m.prior01
     , m.prior02
     , m.prior03
     , m.prior04
 ORDER BY prior01, prior02, prior03, prior04
;

 

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