쿼리속도저하 원인 0 5 838

by 지피지기 [MySQL] [2018.07.20 11:57:47]



안녕하세요.
이제 개발을 시작을 초보신입개발자입니다.



지금 골프장관련 프로그램을 진행하고있는데요. 결과물이 노출되도록 처리를 했는데 속도면서 늦은감이 있어 질문을 드릴까합니다.

골프장보면 회원권이 있는데요, 해당골프장별 회원권은 여러개가 있을수 있습니다.

이에따라 회원권의 전일, 금일시세를 노출시키려고 하는데요. 원하는 속도가 나오지 않고있네요 ㅡㅡ

추가적으로 인덱스는 region, leisureCode 2로 잡아놨습니다.

현재 7천건정도가 디비에 쌓여있는데요. 그 수는 계속해서 늘어납니다.

고수분들의 조언좀 바랍니다.



제가 만든쿼리는 아래와 같은데 잘못된 부분에 대한 조언을 구하고자 합니다.

SELECT ws.region                -- 지역코드
     , ws.leisureCode            -- 골프장코드
     , ws.membership_name            -- 회원권이름
     , MAX(ws.seldate) as seldate        -- 회원권의 최근시세날짜
     , ws.prev_date                -- 회원권 전일시세날짜
     , ws.prev_price            -- 회원권 전일시세금액
     , ws.today_date            -- 회원권 금일시세날짜
     , ws.today_price            -- 회원권 금일시세금액
     , wm.idx
     , wm.prdcode                -- 회원권 등록코드
  FROM wiz_membership wm            -- 회원권 테이블
  LEFT JOIN wiz_sise as ws            -- 시세테이블
    ON wm.membership_name = ws.membership_name and
       wm.leisureCode = ws.leisureCode and
       wm.region = ws.region
 WHERE wm.prdcode != '' 
       and ws.membership_name != '' 
       and ws.leisureCode != ''
   GROUP BY ws.leisureCode, ws.membership_name
   ORDER BY ws.region asc , ws.membership_name asc

by 아발란체 [2018.07.20 12:30:03]

ws.seldate 요거 인덱스 안태우면 풀스캔 됩니다.

그리고 조건절에 있는 항목/그룹바이절 항목/정렬항목 인덱스 없다면 만들어서 타 태워야 할 것 같습니다.

 

2개 테이블인데 한쪽 테이블에서 조회집합을 확연히 먼저 줄일 수 있다면 서브쿼리로 한번 걸려준다음 작은 집합쪽으로 인덱스 태워 조인하는 것이 좋을 것 같습니다.

 


by 우리집아찌 [2018.07.20 13:07:42]

조건절 에 있는 항목들 말씀하신거 같은데요.

ON 절도 마찬가지구요...


by 우리집아찌 [2018.07.20 12:36:13]

7000건인데 속도가 느리다니 좀 이상하네요..

일단 양쪽테이블에 membership_name 대한 INDEX가 있는지 확인하세요.

 

 


by 우리집아찌 [2018.07.20 12:48:34]

그리고 그냥 INNER JOIN 하셔도 될듯한데요.

 


by 마농 [2018.07.23 08:14:36]

mySQL 에서만 허용되는 표준을 따르지 않는 그룹바이 구문을 사용하셨네요.

SELECT ws.region                -- 지역코드
     , ws.leisureCode           -- 골프장코드
     , ws.membership_name       -- 회원권이름
     , ws.seldate               -- 회원권의 최근시세날짜
     , ws.prev_date             -- 회원권 전일시세날짜
     , ws.prev_price            -- 회원권 전일시세금액
     , ws.today_date            -- 회원권 금일시세날짜
     , ws.today_price           -- 회원권 금일시세금액
     , wm.idx
     , wm.prdcode               -- 회원권 등록코드
  FROM (SELECT leisureCode, membership_name
             , MAX(seldate) seldate
          FROM wiz_sise
         WHERE leisureCode != ''
           AND membership_name != '' 
         GROUP BY leisureCode, membership_name
        ) a
 INNER JOIN wiz_sise ws
    ON a.leisureCode      = ws.leisureCode
   AND a.membership_name  = ws.membership_name
   AND a.seldate          = ws.seldate
 INNER JOIN wiz_membership wm
    ON wm.membership_name = ws.membership_name
   AND wm.leisureCode     = ws.leisureCode
   AND wm.region          = ws.region
 WHERE wm.prdcode != ''
;

 

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