COUNT(*)가 어느 순간부터 감당이 안되는 시점
2026. 2. 9. 18:50ㆍSQL
안녕하세요. 꼬북꼬북
개발일기 적는 거북이에요.
오늘은 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시간 더 빨리 퇴근할 수 있을 거예요.
오늘도 개발자들의 칼퇴를 응원합니다.
- 개발 일기 적는 거북이 -