mysql group by SUM 쿼리 하나만봐주세요. 0 6 769

by 토마톰 [MySQL] [2019.10.30 11:03:07]


    SELECT media_id
		, SUM(like_count_diff) + SUM(comments_count_diff) + SUM(saved_count_diff) reaction_count
		, SUM(impressions_count_diff) impressions_count
		, SUM(like_count_diff)  like_count
		, SUM(comments_count_diff)  comments_count
		, SUM(saved_count_diff)  saved_count
		, SUM(reach_count_diff)  reach_count
	FROM summaryMedia
	WHERE account_id = '17841403099279494'
	AND date >= '20190901' 
    AND date <= '20191030'
    GROUP BY media_id
    ORDER BY NULL

 

위에 쿼리에 현재 타고있는 인덱스는 (account_id, date) 입니다.

1 SIMPLE summaryMedia   range idx_accountid_date,idx_mediaid_date,idx_date_mediaId_accountId idx_accountid_date 238   1985210 100.00 Using index condition; Using temporary

 

간단히 설명드리자면 summaryMedia 테이블에 media_id별, 시간별로 계속 수치가 집계되고 증감값이 각 _diff 컬럼에 꽂힙니다.

그래서 특정 날짜범위에 미디이벌 총 증감수치 (_diff 합) 을 구하는것인데요. 단순히 group by 를 빼고 id와 날짜 조건으로 셀렉만 했을때는 빠른데 그룹바이가 들어가자마자 느려집니다.

날짜범위가 커질수록 당연히 group할 데이터수가 많아지고 위 쿼리 조건 셀렉했을때 row수는 992,486 건입니다.

인덱스와 쿼리 수정을 어떻게하면 빨라질까요??

 

 

감사합니다.

by 마농 [2019.10.30 11:17:17]

인덱스는 account_id + date 로 정상적으로 탄 것 같네요.
다만 99만건을 인덱스 스캔하게 되면 풀스캔만 못할 수 있습니다.
인덱스는 소량 검색시 유리합니다. 대량 검색시는 차라리 풀스캔이 유리할 수 있습니다.
두달치 99만 건이면? 월별 파티션 테이블로 관리하면 좋을 듯 합니다.
파티션 두개만 풀스캔하면 끝이죠.


by 토마톰 [2019.10.30 11:27:03]

답변감사드립니다.

DB를 잘 모르다보니.. 추가로 질문좀 드리자면 조건에 해당하는 데이터를 select할때에는 빠른데 거기에 group by를 추가했을때 속도가 느려지는 문제인데요.

group by 하는것도 같은 맥락에서 보는게 맞는건가요??

99만건을 빠르게 조회는했고 그 조회한 데이터 결과를 가지고 group by를 진행하는데 단순히 그룹지을 데이터가 많아서 그런건 아닌건가 궁금합니다.


by 우리집아찌 [2019.10.30 11:31:18]

99만건을 전체 가져오는데 빠르다는 말씀인가요?

 


by 토마톰 [2019.10.30 13:08:50]

limit 1000이 기본으로 걸려있기때문에 빠르다고 생각을 잘못한것같습니다./


by 마농 [2019.10.30 11:34:09]

응답이 빠를 뿐 전체 조회가 빠른게 아닙니다.
일반 쿼리는 일부 자료만 읽어온 순서대로 우선 보여주기 때문에 빠르게 느낄 수 있습니다.
집계 쿼리는 일부만 읽어서는 보여줄 수가 없습니다.
전체를 다 읽고 난 뒤 집계하여 보여주기 때문에 느린거구요.


by 토마톰 [2019.10.30 13:09:16]

아 그렇다면 말씀해주신 일부 자료를 limit 이라고 생각하고 1000건이면 아래와같이 쿼리타임이나 fetch 되는 시간이 빠른데요.

13:05:05    SELECT *  FROM cindi_summary.summaryMedia  WHERE account_id = '17841403099279494'  AND date >= '20190801'      AND date <= '20191030'     -- GROUP BY date     -- GROUP BY media_id     ORDER BY NULL LIMIT 0, 1000    1000 row(s) returned    0.047 sec / 0.046 sec
 

group by가 진행될때에는 99만건을 limit 없이 전체 fetch후 집계가 되기때문에 느리다고 이해하면될까요?? 워크벤치상에서 limit 없이 전체를 쿼리하면 Fetch 되는시간이 굉장히 오래걸리긴 합니다. 방금 해보니 Duration은 0.032초, Fetch 115초가 걸렸네요.

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