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
'DBMS > MySQL' 카테고리의 다른 글
[MySQL] smallint? tinyint? int의 종류와 범위 (0) | 2021.07.06 |
---|---|
[MySQL] 대소문자 구분하여 비교 및 검색 (BINARY) (0) | 2021.07.01 |