본문 바로가기

Development/PHP

쿼리 페이징을 최대한 빠르게


 

보통 처음 웹프로그램을 PHP로 배울때 게시판같은걸 만들게 되죠.

이번에 SQL에서 재밌는 기능을 발견해서 글을 남겨봅니다.

 

 

우선 PHP에서 가장 기본적으로 지원하는 쿼리 결과 카운트 함수입니다.

 

mysql_num_rows($result);

 

생긴게 참 직관적이지만, 속도가 완전 저질입니다. 실제로 처음에 잘 모르고 상업용 사이트에 사용했다가 피본적도 있죠.

 

이는 쿼리를 일일히 세아려서 총 갯수를 구하는 방식이라서 mysql_fetch_array를 계속 돌리는거나 마찬가지입니다.

 

그래서 요즘엔 처음 공부할때 빼고는 거의 쓰지도 않는 것 같네요.

 

 

다음은 sql의 힘을 빌어서 총 카운트를 구하는 방식입니다.

 

$query = "select count(*) as cnt from table";

 

이렇게 구할 쿼리 앞에 count(*)를 통해 결과로 나올 행의 카운트를 구할 수 있습니다. 이 쿼리를 날려 결과값을 받아와 cnt를 확인해보면 됩니다.

 

이경우엔 count(*)가 너무 이기적이라 다른 인자를 함께 받아올수가 없는 단점이 있어 한번더 데이터를 받아오는 쿼리를 날려야합니다. 쿼리를 두번날리는 격이되죠.

 

 

 

오늘 소개할 방법은 아래와 같습니다.

 

$query = "select SQL_CALC_FOUND_ROWS * from table"

 

우선 이렇게 작성할 쿼리 내에 'SQL_CALC_FOUND_ROWS' 요런 셋팅을 걸어줍니다.

이렇게 사용하여 쿼리를 날린 후에 기존과 같이 똑같이 사용하면 됩니다. 사용법에 아무런 문제가 없습니다.

 

그리고 총 카운트를 알고 싶을때 또다시 쿼리를 날립니다.

 

$query = "SELECT FOUND_ROWS() as cnt";

 

이 쿼리를 날린다음 결과의 cnt 값을 읽어내면 클리어, 맨처음 쿼리가 들어갔을때 기억해놓은 것이기 때문에 단순한 변수를 받아오는 것마냥 빠릅니다.

 

카운트를 알아내야할 쿼리를 보낼때에는 이런 방식을 사용하면 계산시간이 절반으로 뚝 떨어지겠죠.

 

 

 

SQL도 보면 볼수록 신기한 것 같습니다. 모르면 아무것도 모르고 알면 알수록 편해지는 블랙박스네요.


 

'Development > PHP' 카테고리의 다른 글

PHP 엑셀다운로드  (0) 2011.11.28
PHP 날짜함수 2  (0) 2011.10.10
쿼리 페이징을 최대한 빠르게  (0) 2011.09.22
PHP 기본적인 페이징(Paging)  (0) 2011.09.22
PHP 날짜 함수  (0) 2011.09.22
PHP 문자열 함수  (0) 2011.09.22