MySQL 페이징 처리 limit 사용시 COUNT(*) 쉽게 하기 - FOUND_ROWS()
FOUND_ROWS 적용 전
페이징 처리를 위해 limit 사용 시 전체 게시물의 수를 알기 위해 쿼리를 한번 더 해야 한다.
1. 해당 조건을 만족하는 게시물의 전체 수 조회
2. 그 페이지에서 보여줄 내용 조회
FOUND_ROWS 적용 후
SQL_CALC_FOUND_ROWS & FOUND_ROWS
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개
두번째 쿼리 카운트 값 : WHERE조건에 해당되는 Rows 카운트 ( 1~100사이에 누락된 번호가 없다면 99을 리턴 )
주의사항
1. SQL_CALC_FOUND_ROWS 키워드는 UNION의 첫 번째 SELECT에 나타나야 한다.
2. FOUND_ROWS()의 값은 UNION ALL을 사용하는 경우에만 정확합니다. ALL이 없는 UNION을 사용하면 중복 제거가 발생하고 FOUND_ROWS()의 값은 근사치만 된다.
3. UNION에 LIMIT가 없는 경우 SQL_CALC_FUND_ROWS는 무시되고 UNION을 처리하기 위해 생성된 임시 테이블의 행 수를 반환한다.
4. 복제시) FOUND_ROWS() 은 statement-based 형태로는 안정적으로 복제되지 않습니다, 이경우 row-based 형태로 자동 변경되어 복제가 됩니다.
※ MySQL 4.7.16 이전 버전에는 버그가 있어, 원하는 결과를 리턴하지 않음
* 5.7.16 이전 버전의 Query중 SybQuery가 있다면, SubQuery 내의 결과 Row 수를 FOUND_ROWS()로 Retrun
* 5.7.16 버그 픽스 이후는 전체쿼리문을 하나의 구문으로 보고 결과 ROW수를 FOUND_ROWS()로 return
FOUND_ROWS() 함수의 기능은 이전 SELECT 된 쿼리의 ROWS를 RETURN 하는 함수(즉, 5.7버전의 기능이 정확)
FOUND_ROWS() 함수는 MySQL 8.0.17에서 더 이상 사용되지 않으며 향후 버전의 MySQL에서 제거될 것으로 예상된다..
참고
'DB Skill > MySQL' 카테고리의 다른 글
MySQL DELETE JOIN with INNER JOIN (1) | 2022.10.11 |
---|---|
MySQL 성능 관련 Config 설정 (0) | 2022.08.19 |
[MySQL] InnoDB File format - Barracuda (0) | 2022.01.14 |
[MySQL] Long Query / Transaction , Block Query, Lock ... (0) | 2022.01.13 |
[MySQL] AUTO_INCREMENT 사용법 (0) | 2021.12.31 |