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 건입니다.
인덱스와 쿼리 수정을 어떻게하면 빨라질까요??
감사합니다.
아 그렇다면 말씀해주신 일부 자료를 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초가 걸렸네요.