인프런 커뮤니티 질문&답변

민경언님의 프로필 이미지

작성한 질문수

Real MySQL 시즌 1 - Part 1

Ep.03 COUNT(*) & COUNT(DISTINCT) 튜닝

전체 count(*) 내용에 대해서 문의 드립니다.

해결된 질문

24.07.29 15:50 작성

·

123

1

안녕 하세요..

실제로 count(*) 때문에 고민이 많습니다.

게시판 형태의 화면이 있는데요..

데이터가 약 250만건 정도 입니다.

조인된 테이블은 6개 이고요..

테이블 6개를 조인 해서 보여주다 보니 검색 조건은 매우 많습니다.

페이징을 20개씩 10페이지씩 보여주고 있는데요..

강의 내용 대로 전체 count(*) 때문에 속도가 느립니다.

전체 갯수를 소스 상에 써 놓고 테스트를 해보면 속도가 느리지 않거든여..

강의를 보기 전에도 테스트 해본 결과 속도는 전체 갯수의 count(*) 문제 라고 판단 하고 있었는데요..

시스템의 로우 갯수를 사용 하는 방법이나

리눅스의 cron 으로 각 테이블의 갯수를 10분 단위로 입력 하는 것 등..

여러가지 생각을 해보았으나..검색 때문에 포기 했습니다.

검색을 하면 검색 결과에 대한 전체건수가 나와야 하는데..

이건 실시간 아니면 파악할 수가 없으니까요..

강의를 보면서 힌트를 얻고자 했으나..

대략적인 건수..

임의의 페이지 표기

통계 이용

대략 이해는 됩니다만..

만일 검색을 하게 되면..모두 사용 할 수 없는 것 아닌가요?

강의 에서 얘기한 것들은 모두 아무런 조건이 없을 경우 이고..

예를 들어 검색 조건이 10가지 정도 될 경우 어떤 조건으로 검색할 지 모르는 상황인데

대략적인 건수를 표시할 수도 없고 임의의 페이지를 표시할 수도 없습니다.

예를 들어 검색 조건 시 1개도 없는 경우도 있을 수 있는데..

어떻게 대략적인 건수를 표시를 할 것이며..

임의의 페이지를 표시 할 수 있을까요..

검색결과가 1건도 나오지 않았는데 페이지를 1~10 까지 대략적으로 표시할 수는 없는 것 아닌가요?

통계이용은 검색 시 더더욱 사용할 수 없고요..

제시하신 방법으로는 문제가 해결 될 것 같지 않은데..

제가 잘못 생각 하고 있는 걸까요?

제 생각이 틀렸으면 좋겠습니다만..

방법이 있을까요?

답변 1

0

이성욱님의 프로필 이미지
이성욱
지식공유자

2024. 07. 29. 18:03

안녕하세요.

말씀하신 대로 문제 해결 방법은 쉽지 않아 보입니다.

 

강의 내용에도 언급되어 있는 것처럼, 지정된 건수까지만 확인하는 방법도 괜찮지 않을까 싶긴 해요.

검색의 경우, 최대 200건까지만 (페이지당 20건씩, 그리고 10개 페이지를 네비게이션하는 상황) 건수를 확인하면 되지 않나 싶어요. 정확한 건수를 모두 확인하려면 성능이 느려질 수 있으니까요. 물론 이 경우에도 쿼리가 적절히 인덱스를 사용할 수 있어야 성능 향상이 가능합니다.

 

row_count = "SELECT COUNT(*) FROM (SELECT 1 FROM tab WHERE ... LIMIT 20*10) z";

rows = "SELECT * FROM tab WHERE ... LIMIT 20";

 

위 결과에서 row_countrows를 이용해서 첫 페이지를 보여주는 방식인거죠.

정확히 전체 건수는 모르지만, 적어도 이번 페이지에서 보여줘야 할 페이지 번호(페이지 네비게이션) 정도는 최소한의 자원 사용으로 구할 수 있을 것 같아요.

 

강의 내용에서도 말씀드렸듯이, 이런 요건을 처리하기는 쉽지 않습니다.

검색 결과 건수가 많아지면 많아질수록 정확한 건수는 큰 의미가 없어지는 것 같아요. 그래서 대략의 건수를 보여주는 방법을 적절히 섞어보면 좋을 것 같습니다.

 

감사합니다.