MySQL에서 LIMIT 사용 시 전체 행 수 구하기
MySQL에서 LIMIT 절을 사용해 일부 행만 조회하면서도, 조건에 맞는 전체 행의 개수를 함께 알고 싶은 경우가 자주 있습니다. 이럴 때 SQL_CALC_FOUND_ROWS 키워드를 활용하면 됩니다. 기본 문법은 다음과 같습니다.
SELECT SQL_CALC_FOUND_ROWS * FROM yourTableName LIMIT 0, yourLastValue;
문법을 제대로 이해하기 위해 실제 예제 테이블을 만들어 단계별로 살펴보겠습니다.
1. 예제 테이블 생성
먼저 아래 쿼리로 테이블을 생성합니다.
mysql> CREATE TABLE RowsUsingLimit
-> (
-> Id int NOT NULL,
-> Name varchar(10)
-> );
Query OK, 0 rows affected (3.50 sec)2. 데이터 삽입
INSERT 명령어로 몇 개의 레코드를 추가합니다.
mysql> INSERT INTO RowsUsingLimit VALUES(10,'Larry'); Query OK, 1 row affected (0.17 sec) mysql> INSERT INTO RowsUsingLimit VALUES(9,'Mike'); Query OK, 1 row affected (0.19 sec) mysql> INSERT INTO RowsUsingLimit VALUES(15,'Sam'); Query OK, 1 row affected (0.18 sec) mysql> INSERT INTO RowsUsingLimit VALUES(20,'Bob'); Query OK, 1 row affected (0.17 sec) mysql> INSERT INTO RowsUsingLimit VALUES(1,'Carol'); Query OK, 1 row affected (0.14 sec) mysql> INSERT INTO RowsUsingLimit VALUES(18,'David'); Query OK, 1 row affected (0.13 sec)
3. 저장된 전체 레코드 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> SELECT * FROM RowsUsingLimit;
실행 결과는 다음과 같습니다.
+----+-------+ | Id | Name | +----+-------+ | 10 | Larry | | 9 | Mike | | 15 | Sam | | 20 | Bob | | 1 | Carol | | 18 | David | +----+-------+ 6 rows in set (0.00 sec)
4. SQL_CALC_FOUND_ROWS로 LIMIT과 함께 조회
이제 LIMIT을 적용하면서 동시에 전체 행 수를 계산하도록 하는 쿼리입니다.
mysql> SELECT SQL_CALC_FOUND_ROWS * FROM RowsUsingLimit LIMIT 0,6;
실행 결과는 다음과 같습니다.
+----+-------+ | Id | Name | +----+-------+ | 10 | Larry | | 9 | Mike | | 15 | Sam | | 20 | Bob | | 1 | Carol | | 18 | David | +----+-------+ 6 rows in set (0.00 sec)
5. 전체 행 수 확인하기
SQL_CALC_FOUND_ROWS가 포함된 쿼리를 실행한 직후에는 FOUND_ROWS() 함수를 호출해야 실제 전체 행 수를 얻을 수 있습니다.
mysql> SELECT FOUND_ROWS(); +--------------+ | FOUND_ROWS() | +--------------+ | 6 | +--------------+ 1 row in set (0.00 sec)
즉, LIMIT으로 화면에는 일부 행만 보여주더라도 FOUND_ROWS()를 통해 페이지네이션에 필요한 전체 개수를 별도의 COUNT(*) 쿼리 없이 한 번에 처리할 수 있습니다.
참고: MySQL 8.0 이후 주의 사항
다만 SQL_CALC_FOUND_ROWS는 MySQL 8.0.17부터 폐기(deprecated) 대상이 되었으며, 향후 버전에서는 제거될 수 있습니다. 최신 버전에서는 LIMIT 조회와 별개로 SELECT COUNT(*) FROM yourTableName; 쿼리를 실행해 전체 행 수를 구하는 방식이 권장됩니다. 성능 면에서도 인덱스를 잘 활용한 COUNT(*) 쿼리가 더 안정적인 선택일 수 있습니다.