Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 LIMIT 사용 시 전체 행 수까지 구하는 방법

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(*) 쿼리가 더 안정적인 선택일 수 있습니다.