source

MySQL 데이터베이스의 테이블 크기를 가져오려면 어떻게 해야 합니까?

manysource 2022. 11. 4. 23:30

MySQL 데이터베이스의 테이블 크기를 가져오려면 어떻게 해야 합니까?

다음 쿼리를 실행하여 MySQL 데이터베이스에 있는 모든 테이블의 크기를 가져올 수 있습니다.

show table status from myDatabaseName;

결과 파악에 도움이 필요합니다.사이즈가 가장 큰 테이블을 찾고 있습니다.

어느 칼럼을 봐야 하나요?

다음 쿼리를 사용하여 테이블의 크기를 표시할 수 있습니다(단, 먼저 변수를 대체할 필요가 있습니다).

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;
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
ORDER BY `DB Size in MB` DESC;

결과

DB Name              |      DB Size in MB

mydatabase_wrdp             39.1
information_schema          0.0

자세한 내용은 이쪽에서 보실 수 있습니다.

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; 

크기(MB 단위 DB 크기)가 정렬됩니다.

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

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;
  • 모든 테이블의 크기:

    데이터베이스 또는TABLE_SCHEMAname은 news_discloss입니다.그런 다음 이 쿼리는 데이터베이스 내의 모든 테이블의 크기를 표시합니다.

    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)
    

Workbench를 사용하여 많은 정보를 쉽게 얻을 수 있는 방법이 있습니다.

  • 스키마 이름을 마우스 오른쪽 버튼으로 클릭하고 "Schema inspector"를 클릭합니다.

  • 표시되는 창에는 여러 탭이 있습니다.첫 번째 탭 "Info"는 데이터베이스 크기(MB)의 대략적인 견적을 보여줍니다.

  • 두 번째 탭인 "테이블"에는 각 테이블의 데이터 길이 및 기타 세부 정보가 표시됩니다.

다음 셸 명령을 사용해 보십시오(바꾸기).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

phpmyadmin을 사용하는 경우 테이블 구조로 이동합니다.

예.

Space usage
Data    1.5 MiB
Index   0   B
Total   1.5 Mi

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

ChapMic의 답변에 따라 특별히 필요한 사항을 충족시킵니다.

데이터베이스 이름만 지정한 다음 선택한 데이터베이스 내에서 모든 테이블을 내림차순으로 정렬합니다.하나의 변수만 바꾸면 됩니다= 데이터베이스 이름입니다.

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;

기존 답변에서는 디스크의 테이블 크기를 알 수 없기 때문에 더 도움이 됩니다.이 쿼리는 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

「 」가 sshaccess를 '접속'을 시도해 볼 수 있습니다.du -hc /var/lib/mysql 다르다)datadir에서 와 같이my.cnf도 마찬가지입니다을 사용하다

행과 스페이스의 수를 표시해, 거기에 의해서 순서가 매겨지는 다른 방법입니다.

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"뿐입니다.

이는 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; 
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에서 테스트됩니다.

마지막에 데이터베이스의 총 크기를 계산합니다.

(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"
)
select x.dbname as db_name, x.table_name as table_name, x.bytesize as the_size from
  (select
     table_schema as dbname,
     sum(index_length+data_length) as bytesize,
     table_name
   from
     information_schema.tables
   group by table_schema
  ) x
where
  x.bytesize > 999999
order by x.bytesize desc;

테이블 크기(바이트 및 행 수)를 추적하기 위해 이 셸 스크립트를 만들었습니다.

#!/bin/sh

export MYSQL_PWD=XXXXXXXX
TABLES="table1 table2 table3"

for TABLE in $TABLES;
do
        FILEPATH=/var/lib/mysql/DBNAME/$TABLE.ibd
        TABLESIZE=`wc -c $FILEPATH | awk '{print $1}'`
        #Size in Bytes
        mysql -D scarprd_self -e "INSERT INTO tables_sizes (table_name,table_size,measurement_type) VALUES ('$TABLE', '$TABLESIZE', 'BYTES');"
        #Size in rows
        ROWSCOUNT=$(mysql -D scarprd_self -e "SELECT COUNT(*) AS ROWSCOUNT FROM $TABLE;")
        ROWSCOUNT=${ROWSCOUNT//ROWSCOUNT/}
        mysql -D scarprd_self -e "INSERT INTO tables_sizes (table_name,table_size,measurement_type) VALUES ('$TABLE', '$ROWSCOUNT', 'ROWSCOUNT');"
        mysql -D scarprd_self -e "DELETE FROM tables_sizes WHERE measurement_datetime < TIMESTAMP(DATE_SUB(NOW(), INTERVAL 365 DAY));"
done

이 MySQL 테이블이 있는 것을 전제로 하고 있습니다.

CREATE TABLE `tables_sizes` (
  `table_name` VARCHAR(128) NOT NULL,
  `table_size` VARCHAR(25) NOT NULL,
  `measurement_type` VARCHAR(10) NOT NULL CHECK (measurement_type IN ('BYTES','ROWSCOUNT')),
  `measurement_datetime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP()
) ENGINE=INNODB DEFAULT CHARSET=utf8

이것은 단지 나중에 참고하기 위한 메모입니다.모든 답변은 다음 항목에 의존합니다.I_S.TABLES테이블 내에 blob 필드가 있는 경우 등 정확한 크기를 알 수 없습니다.LOB 페이지는 외부 페이지에 저장되므로 클러스터된 인덱스에서 계산되지 않습니다.실제로 다음과 같은 주의사항이 있습니다.

NDB 테이블의 경우 이 문의 출력에는 BLOB 열이 고려되지 않는 것을 제외하고 AVG_ROW_LENGH 및 DATA_LENGH 열에 대한 적절한 값이 표시됩니다.

저는 InnoDB에도 해당된다는 것을 알게 되었습니다.

저는 같은 목적으로 커뮤니티 버그를 만들었습니다.

언급URL : https://stackoverflow.com/questions/9620198/how-to-get-the-sizes-of-the-tables-of-a-mysql-database