안녕하세요 mysql을 가지고 작업을 하고 있습니다. 그러던 중 카운팅이 필요한 자료가 있어 해당 테이블을 뷰로 만들어서 사용중입니다. 데이터가 5-60만건 정도 쌓이자 속도가 갑자기 느려져 뷰를 조금 변경하고, 카운팅에 사용되는 컬럼들에 대해 각각 또는 그룹으로 인덱싱을 줘서 조금 속도 이슈를 해결한 상태입니다. 그런데 데이터가 더 쌓이면 속도가 다시 느려질 것을 감안하여 튜닝을 해보려 했으나 제 실력에서는 여기서 더 이상 변경이 불가능합니다..ㅠ 혹시 아래 쿼리를 조금 더 속도를 빠르게 변경할 수 있는 방법이 있을까요?? SELECT A,B,C , COUNT(0) OVER (PARTITION BY A) AS COUNT1 , COUNT(0) OVER (PARTITION BY A,B) AS COUNT2 , COUNT(0) OVER (PARTITION BY A,C) AS COUNT2 FROM TABLE
단순히 말씀드린 코드 그대로입니다.
테이블에는 A,B,C 3개의 컬럼과 아이디를 저장하는 컬럼이 있고
A는 사용자 아이디를 저장, B는 데이터 아이디를 저장, C는 데이터의 유형을 구분하는 컬럼입니다.
그래서 A와 B는 number값으로 1,2,3 같이 들어가며 C는 단순 스트링입니다.
select `count1` ,(`count1`/`count2`) AS 'ratio1' ,(`count1`/`count3`) AS 'ratio2' from ( ( select A, B count(0) OVER (PARTITION BY A,B ) AS `count1`, count(0) OVER (PARTITION BY A ) AS `count2`, count(0) OVER (PARTITION BY A,C ) AS `count3` from TABLE ) INTABLE ) order by `count1` desc
1. 조회 항목이 카운트 뿐인가요?
- a, b, c 를 함께 조회해야 의미가 있을 듯 합니다.
2. 조회조건은 따로 없이 전체 풀스캔인가요?
3. 그룹바이 카운트가 아닌 COUNT(*) OVER() 를 사용한 게 좀 이상합니다.
- B 의 비율과 C 의 비율을 함께 조회해서 그런걸까요?
- 각각 따로 조회해야 하지 않을까? 생각됩니다.
SELECT a , b , SUM(COUNT(*)) OVER(PARTITION BY a) cnt_a , COUNT(*) cnt_b , COUNT(*) / SUM(COUNT(*)) OVER(PARTITION BY a) rat_b FROM t GROUP BY a, b ORDER BY cnt_a DESC, a, cnt_b DESC, b ; SELECT a , c , SUM(COUNT(*)) OVER(PARTITION BY a) cnt_a , COUNT(*) cnt_c , COUNT(*) / SUM(COUNT(*)) OVER(PARTITION BY a) rat_c FROM t GROUP BY a, c ORDER BY cnt_a DESC, a, cnt_c DESC, b ;