MySQL에서 하나의 쿼리로 테이블별 행 수 세기
데이터베이스에 속한 모든 테이블의 행(row) 수를 한 번의 쿼리로 확인하고 싶다면 INFORMATION_SCHEMA.TABLES 뷰의 TABLE_ROWS 컬럼을 활용하면 됩니다. 각 테이블을 일일이 열어서 COUNT(*)를 실행하는 것보다 훨씬 빠르고 간편하게 전체 현황을 파악할 수 있습니다.
기본 문법
아래와 같이 INFORMATION_SCHEMA.TABLES에서 테이블 이름과 TABLE_ROWS를 함께 조회하면 됩니다.
SELECT table_name, TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'yourDatabaseName';
'yourDatabaseName' 부분은 실제 사용 중인 데이터베이스(스키마) 이름으로 바꿔서 실행하면 됩니다.
실제 적용 예시
예를 들어 'business'라는 데이터베이스에 포함된 모든 테이블의 행 수를 조회하는 쿼리는 다음과 같습니다.
mysql> SELECT table_name, TABLE_ROWS
-> FROM INFORMATION_SCHEMA.TABLES
-> WHERE TABLE_SCHEMA = 'business';
쿼리를 실행하면 테이블 이름과 해당 테이블의 행 수가 한 줄씩 출력됩니다.
+--------------------+------------+ | TABLE_NAME | TABLE_ROWS | +--------------------+------------+ | accentsearchdemo | 2 | | add1daydemo | 2 | | autoincrement | 4 | | bookindexes | 4 | | deletedemo | 5 | | deleterecord | 6 | | distinctdemo | 8 | | employeetable | 0 | | limitoffsettable | 13 | | randoptimizedemo | 26 | | rankdemo | 5 | | ... | ... | +--------------------+------------+
결과에서 알 수 있듯이, 비어 있는 테이블은 0으로 표시되고 데이터가 있는 테이블은 저장된 행 수가 그대로 출력됩니다.
주의: InnoDB 테이블에서는 근사치 값
TABLE_ROWS는 MyISAM 테이블에서는 정확한 행 수를 반환하지만, InnoDB 테이블에서는 근사치(approximate value)라는 점에 유의해야 합니다. InnoDB는 내부적으로 유지하는 통계 정보를 기반으로 행 수를 추정하기 때문에, 특히 대량의 INSERT나 DELETE가 자주 발생하는 테이블에서는 실제 값과 차이가 날 수 있습니다.
따라서 정확한 행 수가 반드시 필요한 경우에는 각 테이블마다 SELECT COUNT(*)를 실행해야 합니다. 소수의 테이블이라면 UNION ALL을 활용해 한 번의 쿼리로 정확한 카운트를 얻을 수도 있습니다.
SELECT 'table1' AS table_name, COUNT(*) AS row_count FROM table1 UNION ALL SELECT 'table2', COUNT(*) FROM table2;
정리
- 전체 테이블의 행 수를 빠르게 개요 파악할 때 → INFORMATION_SCHEMA.TABLES의 TABLE_ROWS 조회
- 정확한 개수가 필요할 때 → COUNT(*) 직접 실행 또는 UNION ALL 조합 활용
상황에 맞게 두 가지 방법을 구분해서 사용하면, 데이터베이스 관리와 디버깅 작업을 훨씬 효율적으로 처리할 수 있습니다.