Database

[MySQL] DB 내 모든 테이블 ROW 수 확인하기

비번변경 2023. 6. 8. 22:25

개요

단일 테이블에 대한 ROW 수는 특정 테이블에 count 함수를 실행하여 간단하게 구할 수 있다.

SELECT 
    COUNT(*)
FROM
    table_name;

 

실행 결과

| count(1) |
| -------- |
| 2        |

 

그렇다면 데이터베이스 내 모든 테이블을 대상으로 행 수를 얻을 때는 어떻게 해야 할까? 방법을 적어둔다.

 

예시 DB

아래의 DDL로 생성한 예시 데이터베이스를 이용해 테스트해본다.

CREATE TABLE test (
  id INT
);
INSERT INTO test (id) VALUES (1);
INSERT INTO test (id) VALUES (2);

CREATE TABLE IF NOT EXISTS `docs` (
  `id` int(6) unsigned NOT NULL,
  `rev` int(3) unsigned NOT NULL,
  `content` varchar(200) NOT NULL,
  PRIMARY KEY (`id`,`rev`)
) DEFAULT CHARSET=utf8;
INSERT INTO `docs` (`id`, `rev`, `content`) VALUES
  ('1', '1', 'The earth is flat'),
  ('2', '1', 'One hundred angels can dance on the head of a pin'),
  ('1', '2', 'The earth is flat and rests on a bull\'s horn'),
  ('1', '3', 'The earth is like a ball.');

 

 

information_schema에서 조회

데이터베이스 내 저장된 테이블에 대한 정보는 information_schema.tables에 저장되어 있다. tables에는 table_rows라는 컬럼으로 해당 테이블이 저장하고 있는 데이터의 행 수를 저장하고 있다.

다만 information_schema에 저장된 정보와 실제 테이블 수가 동기화되지 않아 정확하지 않을 수 있다. 정확한 데이터를 얻고 싶다면 ANALYZE TABLE 명령어를 사용한 후, 테이블 행 수를 쿼리해야 한다.

ANALYZE TABLE table_name, ...;

SELECT 
    table_name, 
    table_rows
FROM
    information_schema.tables
WHERE
    table_schema = '<DB_NAME>'
ORDER BY table_name;

 

실행 결과

| TABLE_NAME | TABLE_ROWS |
| ---------- | ---------- |
| docs       | 4          |
| test       | 2          |

 

 

모든 테이블에서 직접 조회

MySQL Prepared Statement를 이용해 직접 조회해 본다.

 

1. 데이터베이스 내 모든 테이블 목록을 가져온다.

SELECT 
    table_name
FROM
    information_schema.tables
WHERE 1=1
	AND table_schema = '<DB_NAME>'
    AND table_type = 'BASE TABLE'
;

 

실행 결과

| TABLE_NAME |
| ---------- |
| docs       |
| test       |

 

 

2. SQL을 구성한다.

테이블 목록 조회 쿼리 결과를 table_list라고 할 때, 아래와 같이 SQL문을 구성할 수 있다.

SELECT 
    CONCAT(GROUP_CONCAT(CONCAT('SELECT \'',
                        table_name,
                        '\' table_name,COUNT(*) rows FROM ',
                        table_name)
                SEPARATOR ' UNION '),
            ' ORDER BY table_name')
INTO @sql 
FROM
    table_list
;

서브쿼리 또는 CTE (MySQL 8.0 이상 지원)을 통해 SQL을 생성한다. concat 명령어로 생성한 쿼리문을 @sql에 저장한다.

 

서브쿼리 사용 시

SELECT 
    CONCAT(GROUP_CONCAT(CONCAT('SELECT \'',
                        table_name,
                        '\' table_name, COUNT(*) row_cnt FROM ',
                        table_name)
                SEPARATOR ' UNION '),
            ' ORDER BY table_name')
INTO @sql 
FROM
    (SELECT 
        table_name
    FROM
        information_schema.tables
    WHERE 1=1
        AND table_schema = '<DB_NAME>'
        AND table_type = 'BASE TABLE') table_list
;

 

CTE 사용 시

WITH table_list AS (
SELECT
    table_name
  FROM information_schema.tables 
  WHERE table_schema = '<DB_NAME>' AND
        table_type = 'BASE TABLE'
) 
SELECT CONCAT(
            GROUP_CONCAT(CONCAT("SELECT '", table_name, "' table_name, COUNT(*) row_cnt FROM ", table_name) SEPARATOR " UNION "),
            ' ORDER BY table_name'
        )
INTO @sql
FROM table_list;

 

실행 결과

SELECT @sql;

-- 결과
| @sql                                                                                                                                |
| ----------------------------------------------------------------------------------------------------------------------------------- |
| SELECT 'docs' table_name, COUNT(*) row_cnt FROM docs UNION SELECT 'test' table_name, COUNT(*) row_cnt FROM test ORDER BY table_name |

 

3. @sql에 저장한 명령을 수행한다.

PREPARE s FROM @sql;
EXECUTE s;
DEALLOCATE PREPARE s;

 

실행 결과

| table_name | row_cnt |
| ---------- | ------- |
| docs       | 4       |
| test       | 2       |

 

 

참고 문서

https://www.mysqltutorial.org/mysql-row-count/