MySQL 데이터베이스의 테이블 크기를 얻는 방법은 무엇입니까?


900

이 쿼리를 실행하여 MySQL 데이터베이스의 모든 테이블 크기를 얻을 수 있습니다.

show table status from myDatabaseName;

결과를 이해하는 데 도움이 필요합니다. 가장 큰 크기의 테이블을 찾고 있습니다.

어떤 열을보아야합니까?


8
크기는 무엇을 의미합니까? 행 수? 디스크에서 찍은 바이트?
Mark Byers

@ Mark 디스크의 크기를 원한다면 이것이 올바른 방법입니까? # du -sh /mnt/mysql_data/openx/f_scraper_banner_details.MYI 79G /mnt/mysql_data/openx/f_scraper_banner_details.MYI
Ashish Karpe

3
관련이 관심이 있다면 이 답변Describe All Tables 을 작성했습니다 .
Drew

답변:


1958

이 쿼리를 사용하여 테이블의 크기를 표시 할 수 있습니다 (변수를 먼저 대체해야 함).

SELECT 
    table_name AS `Table`, 
    round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB` 
FROM information_schema.TABLES 
WHERE table_schema = "$DB_NAME"
    AND table_name = "$TABLE_NAME";

또는이 쿼리는 모든 데이터베이스에서 모든 테이블의 크기를 나열합니다.

SELECT 
     table_schema as `Database`, 
     table_name AS `Table`, 
     round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB` 
FROM information_schema.TABLES 
ORDER BY (data_length + index_length) DESC;

3
Blob을 고려하는 것이 확실하지 않지만 잘 작동합니다.
David

5
"IN"을 사용하여 여러 테이블을 지정할 수도 있습니다.AND table_name IN ('table_1', 'table_2', 'table_3');
David Thomas

6
AFAICT, 정적 크기 필드의 길이 만 정확하게 계산합니다. 어떻게 계산 VARCHAR하고 입력 BLOB합니까?
l0b0

3
@kasimir 어느 시점에서 세계는 혼란스러워졌고 일부 표준 조직 및 하드웨어 제조업체는 10 진수 시스템에서 킬로바이트를 정의하는 것이 더 낫다고 결정했습니다. IEC 표준은 이제 기본 2 킬로바이트 (1024 바이트)를 킬로바이트 (KiB)라고합니다. 어쨌든 MySQL은 알지 못하므로 IEC 10 진수 킬로바이트를 원하는 경우 1000으로 나눕니다.
russellpierce

9
이것이 InnoDB 스토리지 엔진에도 적용됩니까? mysql doc here-dev.mysql.com/doc/refman/5.7/en/show-table-status.html 에 따르면 해당 엔진의 data_length 필드에는 클러스터형 인덱스의 크기가 포함됩니다. 데이터의 크기를 올바르게 나타내지 않습니다. 그럴까요?
euphoria83

96
SELECT TABLE_NAME AS "Table Name", 
table_rows AS "Quant of Rows", ROUND( (
data_length + index_length
) /1024, 2 ) AS "Total Size Kb"
FROM information_schema.TABLES
WHERE information_schema.TABLES.table_schema = 'YOUR SCHEMA NAME/DATABASE NAME HERE'
LIMIT 0 , 30

" information_schema "-> SCHEMATA 테이블-> " SCHEMA_NAME "열 에서 스키마 이름을 얻을 수 있습니다.


추가 다음과 같이 mysql 데이터베이스의 크기를 얻을 수 있습니다 .

SELECT table_schema "DB Name", 
Round(Sum(data_length + index_length) / 1024 / 1024, 1) "DB Size in MB" 
FROM   information_schema.tables 
GROUP  BY table_schema; 

결과

DB Name              |      DB Size in MB

mydatabase_wrdp             39.1
information_schema          0.0

당신은 할 수 있습니다 여기에서 추가 정보를 얻을.


41
SELECT 
    table_name AS "Table",  
    round(((data_length + index_length) / 1024 / 1024), 2) as size   
FROM information_schema.TABLES  
WHERE table_schema = "YOUR_DATABASE_NAME"  
ORDER BY size DESC; 

크기를 정렬합니다 (DB 크기 (MB)).


31

쿼리에서 현재 선택된 데이터베이스를 사용하려는 경우 이 검색어를 복사하여 붙여 넣기 만하면됩니다. (수정 필요 없음)

SELECT table_name ,
  round(((data_length + index_length) / 1024 / 1024), 2) as SIZE_MB
FROM information_schema.TABLES
WHERE table_schema = DATABASE() ORDER BY SIZE_MB DESC;

5
또는 더 짧은 (하위 쿼리없이) : SELECT table_name, round ((((data_length + index_length) / 1024 / 1024), 2) SIZE_MBFROM information_schema.TABLES WHERE table_schema = DATABASE () ORDER BY (data_length + index_length) ASC;
Onkeltem

15

Workbench를 사용하여 많은 정보를 얻는 쉬운 방법이 있습니다.

  • 스키마 이름을 마우스 오른쪽 단추로 클릭하고 "스키마 관리자"를 클릭하십시오.

  • 결과 창에는 여러 개의 탭이 있습니다. 첫 번째 탭 "정보"는 대략적인 데이터베이스 크기 (MB)를 보여줍니다.

  • 두 번째 탭인 "테이블"은 각 테이블의 데이터 길이 및 기타 세부 사항을 보여줍니다.


내 맥 클라이언트 V 6.0.9의 '정보'탭을 가지고 있지 않았다

큰!!! MySQL Workbench에는 각 테이블에 대한 "테이블 검사기"도 있습니다. 빠르지는 않지만 매우 편리합니다!
T30

11
  • 모든 테이블의 크기 :

    데이터베이스 또는 TABLE_SCHEMA이름이 "news_alert" 라고 가정하십시오 . 그런 다음이 쿼리는 데이터베이스에있는 모든 테이블의 크기를 보여줍니다.

    SELECT
      TABLE_NAME AS `Table`,
      ROUND(((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024),2) AS `Size (MB)`
    FROM
      information_schema.TABLES
    WHERE
      TABLE_SCHEMA = "news_alert"
    ORDER BY
      (DATA_LENGTH + INDEX_LENGTH)
    DESC;

    산출:

        +---------+-----------+
        | Table   | Size (MB) |
        +---------+-----------+
        | news    |      0.08 |
        | keyword |      0.02 |
        +---------+-----------+
        2 rows in set (0.00 sec)
  • 특정 테이블의 경우 :

    당신 TABLE_NAME"뉴스" 라고 가정하십시오 . 그런 다음 SQL 쿼리는

    SELECT
      TABLE_NAME AS `Table`,
      ROUND(((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024),2) AS `Size (MB)`
    FROM
      information_schema.TABLES
    WHERE
        TABLE_SCHEMA = "news_alert"
      AND
        TABLE_NAME = "news"
    ORDER BY
      (DATA_LENGTH + INDEX_LENGTH)
    DESC;

    산출:

    +-------+-----------+
    | Table | Size (MB) |
    +-------+-----------+
    | news  |      0.08 |
    +-------+-----------+
    1 row in set (0.00 sec)

8

다음 쉘 명령을 시도 DB_NAME하십시오 (데이터베이스 이름으로 바꾸 십시오).

mysql -uroot <<<"SELECT table_name AS 'Tables', round(((data_length + index_length) / 1024 / 1024), 2) 'Size in MB' FROM information_schema.TABLES WHERE table_schema = \"DB_NAME\" ORDER BY (data_length + index_length) DESC;" | head

Drupal / drush 솔루션의 경우 사용중인 가장 큰 테이블을 표시하는 다음 예제 스크립트를 확인하십시오.

#!/bin/sh
DB_NAME=$(drush status --fields=db-name --field-labels=0 | tr -d '\r\n ')
drush sqlq "SELECT table_name AS 'Tables', round(((data_length + index_length) / 1024 / 1024), 2) 'Size in MB' FROM information_schema.TABLES WHERE table_schema = \"${DB_NAME}\" ORDER BY (data_length + index_length) DESC;" | head -n20

6

bash 명령 줄을 사용하여이를 해결하는 또 다른 방법이 있습니다.

for i in mysql -NB -e 'show databases'; do echo $i; mysql -e "SELECT table_name AS 'Tables', round(((data_length+index_length)/1024/1024),2) 'Size in MB' FROM information_schema.TABLES WHERE table_schema =\"$i\" ORDER BY (data_length + index_length) DESC" ; done


6

phpmyadmin을 사용하는 경우 테이블 구조로 이동하십시오.

예 :

Space usage
Data    1.5 MiB
Index   0   B
Total   1.5 Mi

4

ChapMic의 대답에서 내 특별한 요구에 적응했습니다.

데이터베이스 이름 만 지정한 다음 선택한 데이터베이스 내의 LARGEST에서 SMALLEST 테이블까지 내림차순으로 모든 테이블을 정렬하십시오. 하나의 변수 만 교체하면됩니다 (데이터베이스 이름).

SELECT 
table_name AS `Table`, 
round(((data_length + index_length) / 1024 / 1024), 2) AS `size`
FROM information_schema.TABLES 
WHERE table_schema = "YOUR_DATABASE_NAME_HERE"
ORDER BY size DESC;

3

ssh액세스 권한이 있으면 간단하게 시도 du -hc /var/lib/mysql하거나 ( datadir에서 설정 한대로 다른) 시도 하십시오 my.cnf.


마지막으로 information_schema에 의존하지 않는 답변입니다. 파일 시스템의 실제 크기는 1.8GB 동안 내 경우는 660메가바이트보고
php_nub_qq가

2

점유 된 행 수와 공간을 표시하고 순서를 나타내는 다른 방법입니다.

SELECT
     table_schema as `Database`,
     table_name AS `Table`,
     table_rows AS "Quant of Rows",
     round(((data_length + index_length) / 1024 / 1024/ 1024), 2) `Size in GB`
FROM information_schema.TABLES
WHERE table_schema = 'yourDatabaseName'
ORDER BY (data_length + index_length) DESC;  

이 쿼리에서 대체해야하는 유일한 문자열은 "yourDatabaseName"입니다.


2

기존 답변이 실제로 디스크의 테이블 크기를 제공하지 않는 것이 더 도움이됩니다. 이 쿼리는 data_length & index를 기반으로 한 테이블 크기와 비교하여 더 정확한 디스크 추정치를 제공합니다. 디스크를 물리적으로 검사하고 파일 크기를 확인할 수없는 AWS RDS 인스턴스에 이것을 사용해야했습니다.

select NAME as TABLENAME,FILE_SIZE/(1024*1024*1024) as ACTUAL_FILE_SIZE_GB
, round(((data_length + index_length) / 1024 / 1024/1024), 2) as REPORTED_TABLE_SIZE_GB 
from INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES s
join INFORMATION_SCHEMA.TABLES t 
on NAME = Concat(table_schema,'/',table_name)
order by FILE_SIZE desc

1

마지막에 데이터베이스의 총 크기를 계산하십시오.

(SELECT 
  table_name AS `Table`, 
  round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB` 
  FROM information_schema.TABLES 
  WHERE table_schema = "$DB_NAME"
)
UNION ALL
(SELECT 
  'TOTAL:',
  SUM(round(((data_length + index_length) / 1024 / 1024), 2) )
  FROM information_schema.TABLES 
  WHERE table_schema = "$DB_NAME"
)

1
SELECT TABLE_NAME AS table_name, 
table_rows AS QuantofRows, 
ROUND((data_length + index_length) /1024, 2 ) AS total_size_kb 
FROM information_schema.TABLES
WHERE information_schema.TABLES.table_schema = 'db'
ORDER BY (data_length + index_length) DESC; 

위의 모든 2는 mysql에서 테스트되었습니다.


1

이것은 postgresql이 아닌 mysql에서 테스트해야합니다.

SELECT table_schema, # "DB Name", 
Round(Sum(data_length + index_length) / 1024 / 1024, 1) # "DB Size in MB" 
FROM   information_schema.tables 
GROUP  BY table_schema; 

이것은 저자의 질문에 대답 할 수 있지만, 설명 할 단어 및 / 또는 문서 링크가 부족합니다. 원시 코드 스 니펫은 주변에 문구가 없으면별로 도움이되지 않습니다. 좋은 답변을 작성하는 방법이 매우 도움 이 될 수도 있습니다. 답변을 편집하십시오- 검토에서
Nick

@Nick 왜 아직도 금지되어 있습니까?
William

죄송합니다. 이에 대한 답변을 모르겠습니다. 중재자가 아닙니다.
Nick
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.