Sky Archive

DBMS/MySQL

[MySQL] 페이징 처리 limit 사용시 COUNT(*) 쉽게 하기 - SQL_CALC_FOUND_ROWS & FOUND_ROWS

Anchovy ʕ-᷅ᴥ-᷄ʔ 2021. 10. 20. 18:47

SQL_CALC_FOUND_ROWS & FOUND_ROWS

 

페이징 처리를 위해 limit 사용 시 전체 게시물의 수를 알기 위해 쿼리를 한번 더 해야 한다.

 

1. 해당 조건을 만족하는 게시물의 전체 수 조회
2. 그 페이지에서 보여줄 내용 조회

여기서 조건이 복잡하다면 MySQL에서 제공하는 function을 사용해 보자.


SELECT 최상단에 SQL_CALC_FOUND_ROWS 라는 옵션만 주고 FOUND_ROWS() 를 사용하면 된다.


쿼리는 마찬가지로 두번이지만 두 번째 쿼리는 훨씬 빠르다.
   

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_enchovy WHERE id > 100 LIMIT 10;
mysql> SELECT FOUND_ROWS();


이렇게 하면 첫번째 쿼리로 10 rows의 데이터가 나오고 두 번째 쿼리로 where 절을 만족하는 개수가 나온다.   
단, Union 을 사용하는 쿼리는 주의사항이 있으니 참고해 보세요.

 

1. SQL_CALC_FOUND_ROWS 키워드는 UNION의 첫 번째 SELECT에 나타나야 한다.
2. FOUND_ROWS()의 값은 UNION ALL을 사용하는 경우에만 정확합니다. ALL이 없는 UNION을 사용하면 중복 제거가 발생하고 FOUND_ROWS()의 값은 근사치만 된다.
3. UNION에 LIMIT가 없는 경우 SQL_CALC_FUND_ROWS는 무시되고 UNION을 처리하기 위해 생성된 임시 테이블의 행 수를 반환한다.

 

자세한 내용은 MySQL 공식문서를 참조하자.

 

 

 

※ 하지만 FOUND_ROWS() 함수는 MySQL 8.0.17에서 더 이상 사용되지 않으며 향후 버전의 MySQL에서 제거될 것으로 예상된다..

 

 

MySQL 8.0 manual 

https://dev.mysql.com/doc/refman/8.0/en/information-functions.html#function_found-rows

 

 

※ 참고할만한 사용 예시.

새로운 유저가 방문했을때는 데이터를 새롭게 입력 (INSERT) 시키고,

기존 유저일 경우 (이미 데이터 존재) 해당 유저의 방문 카운트만 +1 해주는 (UPDATE) 쿼리

https://ggmouse.tistory.com/155?category=1072240

 

[MSSQL] @@ROWCOUNT 영향 받은 행 수 반환

실행된 쿼리문의 영향을 받은 행의 수를 반환하는 @@ROWCOUNT에 대해 알아보자 @@ROWCOUNT 쿼리 실행문 실행 후 영향을 받은 로우의 수를 반환한다. 예제 CREATE TABLE #TEMP1 ( 제품 VARCHAR(10), 가격 INT ) IN..

ggmouse.tistory.com