COUNT(*)가 어느 순간부터 감당이 안되는 시점

2026. 2. 9. 18:50SQL

안녕하세요. 꼬북꼬북

개발일기 적는 거북이에요.

오늘은 COUNT(*) 관련된 일기에요.

 

 

 

예를 드는 상황.

페이징용 전체 건수 

로그 테이블 1천만 건....

SELECT COUNT(*)
FROM access_log
WHERE service_id = 3;

 

=> 뭐든 초반엔 빠르고 문제없음

 

하지만 우리의 문제는 

데이터 많아지면..;;; 바로 야근버스 타는거여

 

1. COUNT하나가 1~2초 

2. 화면마다 COUNT 호출 

3. 페이지 이동할 때마다 COUNT

4. 관리자 화면에서도 COUNT

미쳐버리는 COUNT 굴레에 야근행 빠져드는거여...

 

이건 인덱스 문제 아닙니다..

COUNT(*)는 조건에 맞는 모든  ROW를 

정성스럽게 하나하나 세는 작업이에요 

즉 정확한 개수 = 비싼 작업 

 

그럼 우린 거북이 입장해서 해볼 수 있는 걸 해봅니다.

 

해결책 1)

"다음 페이지가 있는지?"에 집중~~

SELECT * 
FROM ACCESS_LOG 
WHERE SERVICE_ID = 3
ORDER BY ID DESC 
LIMIT 21;

 

20개 보여줄 거면  => 21개를 가져온다 

결과가 21개면 => 다음 페이지 있음

20개 이하면? => 마지막 페이지 

 

해결책 2)

COUNT를 "매번"하지 말고 따로 저장 

관리자 화면, 통계 화면, "대략 몇 건"만 보여주면 되는 곳에 추천

 

-- 개수 저장용 테이블 하나 
CREATE TAVLE LOG_COUNT(
	SERVICE_ID INT, 
    TOTAL_COUNT BIGINT
);

-- 가끔만 COUNT 실행(배치/스케줄)
UPDATE LOG_COUNT
SET TOTAL_COUNT = (
	SELECT COUNT(*)
    FROM ACCESS_LOG
    WHERE SERVICE_ID = 3
)WHERE SERVICE_ID = 3;

-- 화면에서는 이 값만 조회 
SELECT TOTAL_COUNT 
FROM LOG_COUNT 
WHERE SERVICE_ID = 3;

 

=> 화면 빨라짐 

=> COUNT는 하루에 한 번 실행되며, 서버는 평화를 되찾아....

 

 

댓글로 경험담을 공유해 주시면 다른 개발자 분이 

1시간 더 빨리 퇴근할 수 있을 거예요.

오늘도 개발자들의 칼퇴를 응원합니다.

- 개발 일기 적는 거북이 -