SQL_CALC_FOUND_ROWS – 페이징의 쿼리 줄이기?

일반적으로 페이징 처리를 할때 검색 결과의 전체 갯수를 필요로 합니다. 문제는 이 전체 갯수를 구하기 위해서 동일한 조건을 가지는 쿼리를 한번 더 실행 해야 한다는 점입니다. 문제라기 보다는 쿼리가 복잡 할 때 코드가 난잡 해지거나 DB의 인덱스를 이용하지 못하는 쿼리의 경우 2번의 쿼리 실행으로 화면에 결과를 표시하는데 더욱더 느려지는 현상을 보여 주게 됩니다.

MySQL에서 Select 할때 SQL_CALC_FOUND_ROWS 를 사용하여 검색하는 일부 정보와 전체 갯수를 한번에 구할 수 있습니다. 정확히 한번은 아닙니다. 구해진 전체 갯수를 “select FOUND_ROWS()”라는 쿼리를 다시 실행해서 저장된 결과값을 가져와야 합니다.

그런데 count(*)을 사용하는 방법과 SQL_CALC_FOUND_ROWS를 사용하는 방법 중에서 어느것이 더 빠르고 서버에 부담을 줄일 수 있는지 정말 궁금 했습니다. 여기저기 찾아 본 결과 select 문의 where 조건이 완벽하게 인덱스를 사용한다면 2번의 쿼리를 실행하는 것이 더 빠르고 부담도 적었고 인덱스를 사용하지 않고 full-scan이나 filesort 상황에서는 SQL_CALC_FOUND_ROWS를 사용하는 것이 빠르고 부담도 적었다 입니다.

빠른 화면을 출력 하기 위해 index 조건을 잘 맞춰주는 것을 생각하다면 두번의 쿼리를 실행하는 것이 맞습니다. 코드가 조금 난잡해져도 서버의 성능은 빨라지니까요. 다만 일부 환경에서는 인덱스를 사용 할 수 없는 경우도 있을것이고 더이상 튜닝이 되지 않는 상황도 있을 건데요. 그렇다면 SQL_CALC_FOUND_ROWS를 사용하는 방법이 더 효과적입니다.

select문의 where 조건이 index를 사용하지 못한다면 SQL_CALC_FOUND_ROWS를 사용하는것이 좋습니다.

[참고 자료]

  1. SQL_CALC_FOUND_ROWS|작성자 가지주인
  2. SQL_CALC_FOUND_ROWS|작성자 삼오사삼 – 패이징 처리 방법 비교
  3. To SQL_CALC_FOUND_ROWS or not to SQL_CALC_FOUND_ROWS?| Posted by Alexey Kovyrin – 인덱스 조건에 따른 쿼리 실행 시간 비교
Advertisements

Published by: benant

WEB PROGRAMMER. PHP, ASP, XML, Javascript, VBScript, PL/SQL, MySQL, Oracle. scrollads.co.kr 새로운 모바일 광고 서비스. trenue.com 시스탬 트래이딩 서비스. blogman.co.kr 블로그 운영 관리 서비스. creget.co.kr 해외 상품 구매대행. 핫딜 정보 제공 서비스. fgshop.co.kr - 독립형 쇼핑몰 솔루션.

카테고리 Web태그, , 댓글 남기기

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중