### 쿼리 개선을 해보자 ```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 인덱스 없음 ![image](https://hackmd.io/_uploads/rywtc0r96.png) 인덱스가 하나도 없음 ![image](https://hackmd.io/_uploads/SkKh50rc6.png) 보니까 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에 어떤 구조로 적용할지, 캐시 생명 주기를 어느 정도로 할지 알아보시면 좋을 것 같아요!