MySql 카운팅 속도 질문드립니다. 0 7 1,650

by 김민재 [MySQL] count mysql 속도 퍼포먼스 [2022.04.06 09:11:47]


안녕하세요 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 

 

by 마농 [2022.04.06 09:49:58]

1. 모든 카운트가 한번에 다 사용되나요?
- 그때 그때 필요한 카운트만 사용할 것 같은데요.
- 한꺼번에 카운트하여 그 중 필요한 것만 사용하는 것 보다는
- 필요할때마다 따로 카운트 하는게 빠를 것 같습니다.
2. 카운트도 집계함수가 아닌 분석함수로 사용되네요?
- 집계 건수가 아닌 분석 건수가 필요한가요?
- 최종 목표가 뭔지 궁금하네요.


by 김민재 [2022.04.06 10:02:14]

안녕하세요 답변 감사합니다.

 저 카운트들을 이용하여 한번 더 계산을 합니다 ex) COUNT1/COUNT2

 모든 카운트들이 한번에 같이 이용이 됩니다.

저렇게 계산을 하여 a,b로 그룹화하여 카운팅한것과 a로 그룹화하여 카운팅한 것의 비율을 얻고자 합니다.

count1/count3도 마찬가지입니다. 

 


by 마농 [2022.04.06 10:04:00]

혹시 뷰쿼리와 뷰를 사용한 전체 쿼리를 볼 수 있을까요?
샘플 데이터 예시도 있으면 좋구요.


by 김민재 [2022.04.06 10:17:22]

단순히 말씀드린 코드 그대로입니다.

테이블에는 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

 


by 마농 [2022.04.06 10:46:33]

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
;

 


by 김민재 [2022.04.06 11:03:47]

감사합니다 속도차이가 어마어마하네요

무조건 한방에 가져오고 싶어서 어떻게든 해보려고 했는데 따로 조회할 수 있도록 코드를 수정해야겠습니다 감사합니다


by 마농 [2022.04.06 11:07:46]

속도 문제라기 보다는
원하는 결과집합에 대한 그림이 잘못 그려진 것 같습니다.
그 때문에 쿼리도 이상해지고 속도도 안나온 것 같습니다.

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