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
関連して、それが興味があるなら、私はこの回答ですべてのテーブル説明を書きました。
2016

回答:


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が考慮されるかどうかはわかりませんが、問題なく機能します。
デビッド

5
「IN」を使用して複数のテーブルを指定することもできます。例:AND table_name IN ('table_1', 'table_2', 'table_3');
David Thomas

6
AFAICT、これは静的サイズのフィールドの長さを正しく数えるだけです。どのように数えVARCHARBLOBタイプしますか?
l0b0 2014

3
@kasimirある時点で世界は混乱し、一部の標準化団体やハードウェアメーカーは、10進法でキロバイトを定義する方がよいと判断しました。IEC標準では、現在、ベース2キロバイト(1024バイト)をキビバイト(KiB)と呼んでいます。いずれにしても、MySQLはIEC進キロバイト、1000で除算をしたいのであれば、知らない
russellpierce

9
これはInnoDBストレージエンジンで機能しますか?mysqlのドキュメント-dev.mysql.com/doc/refman/5.7/en/show-table-status.htmlによると、そのエンジンのdata_lengthフィールドには、クラスター化インデックスのサイズが含まれています。それはデータのサイズを正しく表しません。でしょうか?
euphoria83 2017年

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 table- > " 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で表示されます。

  • 2番目のタブ「テーブル」には、各テーブルのデータ長とその他の詳細が表示されます。


Macクライアントv 6.0.9に「情報」タブがありませんでした
Neil

すごい!!!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テーブルまで。置き換える必要がある変数は1つだけです=データベース名。

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であるのに660MBを報告しました
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とインデックスに基づくテーブルサイズと比較して、より正確なディスク推定を提供します。ディスクを物理的に調べてファイルサイズを確認できない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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.