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

MySQL 쿼리에서 전체 행 수(ROW COUNT)를 구하는 가장 빠른 방법

MySQL에서 특정 쿼리 결과의 전체 행 수(row count)를 구하려면 집계 함수 COUNT(*)를 서브쿼리(subquery) 형태로 활용하면 됩니다. 이 방식은 메인 쿼리의 각 행마다 테이블의 총 행 수를 함께 출력할 수 있어, 목록 조회 시 전체 건수를 동시에 확인해야 하는 경우에 유용합니다.

1. 예제 테이블 생성

먼저 실습용 테이블을 생성합니다.

mysql> create table DemoTable
(
    StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    StudentFirstName varchar(20),
    StudentAge int
);
Query OK, 0 rows affected (0.48 sec)

2. 샘플 데이터 삽입

INSERT 명령을 사용해 학생 데이터를 여러 건 입력합니다.

mysql> insert into DemoTable(StudentFirstName,StudentAge) values('John',23);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable(StudentFirstName,StudentAge) values('Larry',21);
Query OK, 1 row affected (0.40 sec)
mysql> insert into DemoTable(StudentFirstName,StudentAge) values('Johnny',23);
Query OK, 1 row affected (0.43 sec)
mysql> insert into DemoTable(StudentFirstName,StudentAge) values('Chris',21);
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable(StudentFirstName,StudentAge) values('David',23);
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable(StudentFirstName,StudentAge) values('James',21);
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable(StudentFirstName,StudentAge) values('Jace',24);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable(StudentFirstName,StudentAge) values('Mike',21);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable(StudentFirstName,StudentAge) values('Robert',25);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable(StudentFirstName,StudentAge) values('Mike',22);
Query OK, 1 row affected (0.23 sec)

3. 저장된 데이터 확인

SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.

mysql> select *from DemoTable;

실행 결과는 다음과 같습니다.

+-----------+------------------+------------+
| StudentId | StudentFirstName | StudentAge |
+-----------+------------------+------------+
| 1         | John             | 23         |
| 2         | Larry            | 21         |
| 3         | Johnny           | 23         |
| 4         | Chris            | 21         |
| 5         | David            | 23         |
| 6         | James            | 21         |
| 7         | Jace             | 24         |
| 8         | Mike             | 21         |
| 9         | Robert           | 25         |
| 10        | Mike             | 22         |
+-----------+------------------+------------+
10 rows in set (0.00 sec)

4. 서브쿼리로 전체 행 수 구하기

아래 쿼리처럼 메인 쿼리 안에 (select count(*) from DemoTable) 서브쿼리를 넣으면, 각 행마다 테이블의 총 행 수가 별도 컬럼으로 함께 출력됩니다.

mysql> select StudentFirstName,(select count(*) from DemoTable) AS Total_Count from DemoTable limit 10;

실행 결과는 다음과 같습니다.

+------------------+-------------+
| StudentFirstName | Total_Count |
+------------------+-------------+
| John             | 10          |
| Larry            | 10          |
| Johnny           | 10          |
| Chris            | 10          |
| David            | 10          |
| James            | 10          |
| Jace             | 10          |
| Mike             | 10          |
| Robert           | 10          |
| Mike             | 10          |
+------------------+-------------+
10 rows in set (0.03 sec)

참고: 상황별 최적의 COUNT 방법

  • 테이블 전체 행 수만 필요한 경우: 단순히 SELECT COUNT(*) FROM 테이블명;을 실행하는 것이 가장 빠릅니다. InnoDB 스토리지 엔진은 인덱스를 스캔하여 카운트를 계산합니다.
  • 조회 결과와 함께 전체 건수를 표시해야 하는 경우(페이징 등): 위 예제처럼 서브쿼리로 COUNT(*)를 함께 조회하거나, 애플리케이션 레벨에서 별도의 COUNT 쿼리를 한 번 더 실행하는 방식을 사용할 수 있습니다.
  • MySQL 8.0 이상: 윈도우 함수인 COUNT(*) OVER()를 활용하면 서브쿼리 없이도 동일한 결과를 얻을 수 있어 코드가 더 간결해집니다.
    예: SELECT StudentFirstName, COUNT(*) OVER() AS Total_Count FROM DemoTable;