### 쿼리 개선을 해보자
```SQL=
select god.god_no,
god.erp_god_no,
dcc.upper_dsp_ctgry_no as first_category_no,
dccc.dsp_ctgry_nm as first_category_name,
dcc.dsp_ctgry_no as second_category_no,
dcc.dsp_ctgry_nm as second_category_name,
dc.dsp_ctgry_no as third_category_no,
dc.dsp_ctgry_nm as third_category_name,
god.tag_nm,
god.color_tag_nm,
god.god_nm,
god.mobile_god_nm,
god.god_dscr,
god.god_sale_sect_cd,
god.color_cd,
god.kc_crtfc_no,
god.rtl_prc,
god.csmr_prc,
god.prdlst_cd,
god.meta_sj_nm,
god.meta_dscr_cont,
god.meta_kwd,
god.min_ord_qty,
god.max_ord_qty,
god.shop_pkup_psb_yn,
god.brnd_id
from god
left outer join dsp_ctgry dc on god.rep_ctgry_no = dc.dsp_ctgry_no
left outer join dsp_ctgry dcc on dc.upper_dsp_ctgry_no = dcc.dsp_ctgry_no
left outer join dsp_ctgry dccc on dcc.upper_dsp_ctgry_no = dccc.dsp_ctgry_no
where
god.erp_god_no = #{erpgoodsno}
and
god.god_aprv_sect_cd = 'aprv_compt'
and god.god_sale_sect_cd != 'sale_end'
and god.god_tp_cd = 'gnrl_god'
and god.dsp_yn = 'y'
```
### 인덱스 확인
REP_CTGRY_NO 인덱스 없음

인덱스가 하나도 없음

보니까 dsp_ctgry에 상위 카테고리 컬럼(upper_dsp_ctgry_no) 이 있고, 현재 카테고리 컬럼(dsp_ctgry_no)이 있는 것 같은데,
인덱스가 걸려 있지 않은데 서비스 쿼리인 경우, 빠르게 해결하기 위해서는 서비스 로직에서 상위 카테고리를 만들어주는게 좋습니다
-> 이유는 DB에서 조인 세번을 한다고 해도 어차피 들고오는 데이터가 줄어들지 않기 때문에 서비스단에서 메모리적인 측면으로도 나을 게 없어요
left outer join dsp_ctgry dc on god.rep_ctgry_no = dc.dsp_ctgry_no
요 조인 하나만 만들고,
dc.upper_dsp_ctgry_no 를 select로 출력한 뒤에 서비스단에서 나타난 결과 바탕으로 first, second, third 카테고리를 붙여주는게 좋지 않을까 하는 생각입니당....!!
확실하지는 않지만... 요런 상황에서 조인 세 번 되는건 최악의 경우 O^3 시간복잡도가 나올 수 있어요(풀스캔 세번) 데이터가 1만건 이하로 적은 경우에는 엄청나게 큰 문제가 되지는 않겠지만, 데이터가 많아질수록 좀 어려워지는데, 단순 통계 쿼리가 아니고 서비스 쿼리라면 개선 되어야 할 것 같긴 합니다..!
---
캐시를 적용할까?
- 캐시 관련 문서화 중요함
- 주의하실 점은 영구적으로 올려 사용하실거면 꼭 문서화 해서 공유를 하는게 좋을 것 같습니당...!! 캐시 올려두고 안 지우면 용량만 늘어서 오히려 문제가 커질 수 있어요
-
-음 사용하시는게 Redis면 Redis에 어떤 구조로 적용할지, 캐시 생명 주기를 어느 정도로 할지 알아보시면 좋을 것 같아요!