쿼리질문 0 6 1,249

by 호야별리 [MySQL] [2020.04.24 10:04:25]


안녕하세요.

현재 쇼핑몰을 유지보수하고 있는데요.

현재 등록된 상품은 150여개 정도가 됩니다.

구성 : 상품장바구니테이블(cart), 상품테이블(product)

로직

SELECT x.ca_idx                //-- 쇼핑카드 인덱스
     , x.ca_prdno            //-- 상품코드
     , x.ca_prdname            //-- 상품명
     , x.ca_prdimg            //-- 상품이미지
     , x.ca_opt_idx            //-- 옵션인덱스
     , x.ca_opt_amount        //-- 옵션수량
     , y.prd_min_qty        //-- 등록된 상품의 최소구매수량
     , y.prd_max_qty        //-- 등록된 상품의 최대구매수량
  FROM (
    SELECT ca_idx, ca_prdno, ca_prdname, ca_prdimg, ca_opt_idx, ca_opt_amount
      FROM cart
     WHERE ca_id = 'xxxxxxxxx'          //-- 로그인아이디
       AND ca_direct = 'basket'
     GROUP BY ca_prdno
     ORDER BY ca_idx ASC
    ) AS y
  LEFT JOIN product AS y
    ON x.ca_prdno = y.prd_no

위와 같이 구성이 되어있습니다.

한두개의 상품/옵션이 장바구니에 담길때는 문제가 안되는데요.

좀 많이 담게 되면 로딩이 좀 느려지는 경향이 있습니다.

인덱스는 잡혀있구요.

explain을 해보면 using temporary, using filesort로 잡히네요 ㅡㅡ

잘못된 부분이 있으면 조언부탁드립니다.

 

감사합니다.

by 마농 [2020.04.24 10:19:09]

그룹바이 집계쿼리 사용법이 표준에 어긋납니다. -> 이렇게 사용하는 이유가 있는지 모르겠네요?
아우터 조인도 필요성이 있는지 의문이구요. -> 이너 조인 해야 하는게 아닌지?
각 테이블에 어떤 인덱스들이 있는지 정보를 주세요.


by 호야별리 [2020.04.24 11:19:39]

답변감사합니다.

GROUP BY 구문사용에 어긋나는것 같긴하데요.
예를들어서 장바구니 테이블에 상품코드(prd_no) 1개에 2개의 연관 옵션이 2개가 들어가있으면
장바구니리스트에는 한개의 상품에 2개의 옵션제품이 나와야하는데 같은상품이 2개가 나와서 중복회피하려고 임의적으로 한것으로 보입니다.

cart 테이블 인덱스 : ca_id, ca_prdno

product 테이블 인덱스 ; prd_no

위와같이 설정했습니다.


by 마농 [2020.04.24 12:40:38]

뭔가 좀 이상합니다.
ca_id 와 ca_idx 가 다른 항목인가요?
ca_id 에 로그인ID 조건 주는게 맞는 건가요?
두개 항목이 결합인덱스인지? 각각의 인덱스인지? PK 인지?


by 호야별리 [2020.04.24 13:57:54]

답변감사합니다.

ca_idx ca_id는 다른항목입니다.
ca_idx는 PK이고 ca_id는 상품을 장바구니에 담은 회원아이디 입니다.
결합인덱스가 아닌 각각의 인덱스입니다.

 

감사합니다.


by 마농 [2020.04.24 14:18:58]

1. 앞서 답변한 대로 그룹바이가 사용된 부분이 이상합니다.
 - 왜 사용해야 하는지? 의미가 불분명하여 빼도 되지 않을까? 생각도 들고요.
 - 아우터 조인도 마찬가지.
2. 상품이 150 종류밖에 안된다면?
 - 상품으로 그룹바이 해봐야 최대 150건만 나오게 될텐데?
 - 이 정도 숫자에 using temporary, using filesort 뜨는게 이상하네요.


by 호야별리 [2020.04.24 14:41:46]

네 답변감사합니다.

전반적으로 세세하게 확인을 해봐야겠습니다.^^ 많은도움되었습니다.

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