Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.1Mb
EPUB - 7.5Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


13.7.5.37 SHOW TABLE STATUS 構文

SHOW TABLE STATUS [{FROM | IN} db_name]
    [LIKE 'pattern' | WHERE expr]

SHOW TABLE STATUSSHOW TABLES のように機能しますが、TEMPORARY 以外の各テーブルに関する多くの情報を提供します。このリストはまた、mysqlshow --status db_name コマンドを使用して取得することもできます。LIKE 句 (存在する場合) は、どのテーブル名と照合するかを示します。セクション21.32「SHOW ステートメントの拡張」で説明されているように、WHERE 句を指定すると、より一般的な条件を使用して行を選択できます。

このステートメントはまた、ビューに関する情報も表示します。

SHOW TABLE STATUS の出力には、次のカラムがあります。

  • Name

    テーブルの名前。

  • Engine

    このテーブルのストレージエンジン。第15章「代替ストレージエンジンを参照してください。

  • Version

    このテーブルの .frm ファイルのバージョン番号。

  • Row_format

    行ストレージフォーマット (FixedDynamicCompressedRedundantCompact)。MyISAM テーブルの場合、Dynamic は、myisamchk -dvvPacked としてレポートするものに対応します。InnoDB テーブルのフォーマットは、Redundant または Compact としてレポートされます。InnoDB PluginBarracuda ファイル形式の場合、このフォーマットは Compressed または Dynamic である可能性があります。

  • Rows

    行数。MyISAM などの一部のストレージエンジンは、正確な数を格納します。InnoDB などのその他のストレージエンジンの場合、この値は近似値であり、実際の値から 40 から 50% 変動する可能性があります。このような場合、正確な数を取得するには SELECT COUNT(*) を使用します。

    INFORMATION_SCHEMA データベース内のテーブルの場合、Rows 値は NULL です。

  • Avg_row_length

    平均行長。

  • Data_length

    データファイルの長さ。

  • Max_data_length

    データファイルの最大長。これは、このテーブル内に格納できるデータの合計バイト数です (使用されるデータポインタサイズが指定された場合)。

  • Index_length

    インデックスファイルの長さ。

  • Data_free

    割り当てられているが、使用されていないバイト数。

    この情報はまた、InnoDB テーブルに対しても示されます (以前は、Comment 値に含まれていました)。InnoDB テーブルは、このテーブルが属するテーブルスペースの空き領域をレポートします。共有テーブルスペース内に存在するテーブルの場合、これはその共有テーブルスペースの空き領域です。複数のテーブルスペースを使用していて、このテーブルに独自のテーブルスペースがある場合は、そのテーブルのみの空き領域になります。空き領域とは、完全な空きエクステントから安全上のマージンを引いたバイト数を示します。空き領域が 0 として表示されている場合でも、新しいエクステントを割り当てる必要がないかぎり、行を挿入できる可能性があります。

    パーティション化されたテーブルの場合、この値は推定値にすぎず、絶対的に正しいとはかぎりません。このような場合、この情報を取得するためのより正確な方法は、次の例に示すように INFORMATION_SCHEMA.PARTITIONS テーブルへのクエリーです。

    SELECT    SUM(DATA_FREE)
        FROM  INFORMATION_SCHEMA.PARTITIONS
        WHERE TABLE_SCHEMA = 'mydb'
        AND   TABLE_NAME   = 'mytable';
    

    詳細は、セクション21.13「INFORMATION_SCHEMA PARTITIONS テーブル」を参照してください。

  • Auto_increment

    次の AUTO_INCREMENT 値。

  • Create_time

    いつテーブルが作成されたか。

  • Update_time

    いつデータファイルが最後に更新されたか。一部のストレージエンジンでは、この値は NULL です。たとえば、InnoDB はそのシステムテーブルスペース内に複数のテーブルを格納するため、データファイルのタイムスタンプは適用されません。各 InnoDB テーブルが個別の .ibd ファイル内に存在する file-per-table モードの場合でも、変更バッファリングによってデータファイルへの書き込みが遅延される可能性があるため、ファイルの変更時間は最後の挿入、更新、または削除の時間とは異なります。MyISAM の場合は、データファイルのタイムスタンプが使用されます。ただし、Windows ではタイムスタンプが更新によって更新されないため、この値は不正確です。

  • Check_time

    いつテーブルが最後にチェックされたか。すべてのストレージエンジンがこの時間を更新するわけではありません。その場合、この値は常に NULL です。

  • Collation

    このテーブルの文字セットと照合順序。

  • Checksum

    ライブチェックサム値 (存在する場合)。

  • Create_options

    CREATE TABLE で使用される追加のオプション。CREATE TABLE が呼び出されるときに指定される元のオプションは保持されており、ここでレポートされるオプションは、アクティブなテーブル設定やオプションとは異なる可能性があります。

  • Comment

    このテーブルを作成するときに使用されたコメント (または、MySQL がテーブル情報にアクセスできなかった理由に関する情報)。

MEMORY テーブルの場合、Data_lengthMax_data_length、および Index_length 値はほぼ、割り当てられているメモリーの実際の量を表します。割り当てアルゴリズムは、割り当て操作の数を減らすために、大量のメモリーを確保します。

NDB テーブルの場合、このステートメントの出力は Avg_row_length および Data_length カラムの適切な値を示しますが、例外として BLOB カラムは考慮に入れられません。

ビューの場合は、Name がビュー名を示し、Commentview になる点を除き、SHOW TABLE STATUS によって表示されるすべてのフィールドが NULL です。


User Comments
  Posted by H Y on March 23, 2004
If you need to get hold of only one of these columns, there are sometimes another way. E.g. if you don't need row format, type, name, average row length and all the other stuff, but only want to see the total number of rows in a table, use COUNT(*).
  Posted by Steven Szelei on June 28, 2004
I was looking for a way to show the relationship of tables based on unique key, key, index, and foreign key constraints. I found that I can get some of the data using the admin statement SHOW INDEX FROM <<TBL>>. However this will give only the index name and the Column_name in the table that I am requesting from. I then did a SHOW CREATE TABLE <<TBL>> and this dumps the DDL script used to create the table. I would have to parse this information but could get everything I needed. I then found that SHOW TABLE STATUS LIKE <<TBL>> gave me The REFER information mapped to the column name. Unfortunatlly it did so in the Comments field as a string so uh! more parsing. This is what I have been able to discover so far and am still looking for a clean way to gather key, index, and constraint information to dynamically build table relationships. Also I noticed that the constraint names set in the DDL have not been preserved and mysql has given the constraints their own names. Names given keys are preserved. you can see this by running the show create table <<TBL>> on any table you have set constraints on.
  Posted by Bahadir Malkoç on December 5, 2005
Here is an example of using this command with php and get results...


<?php

mysql_connect
("localhost","root","");
$result mysql_query("SHOW TABLE STATUS FROM test;");
while(
$array mysql_fetch_array($result)) {
$total $array[Data_length]+$array[Index_length];
echo 
'
Table: '
.$array[Name].'<br />
Data Size: '
.$array[Data_length].'<br />
Index Size: '
.$array[Index_length].'<br />
Total Size: '
.$total.'<br />
Total Rows: '
.$array[Rows].'<br />
Average Size Per Row: '
.$array[Avg_row_length].'<br /><br />
'
;
}

?>

  Posted by dan f on December 6, 2005
Here is a perl script to add up free space per engine. Whether you are out of space depends on how you have configured MySQL. The InnoDB engine might be limited space, or it might be allowed to grow. The MyISAM space is probably in the file system, which has as much left as it has.

This script is a hack. Feel free to improve and post.

For some reason, I can't get it to format nicely, either.

#!/opt/gnu/bin/perl -w

use strict;

use Getopt::Long;
my @options;

# Get output immediately. It won't hurt performance.
use FileHandle;
autoflush STDERR;
autoflush STDOUT;

my $pw;
push(@options, "password=s", \$pw);

my $host = "localhost";
push(@options, "host=s", \$host);

die "Couldn't parse options" if !GetOptions(@options);

die "Must give -password\n" if !defined($pw);

my $cmd = mysql_cmd("show databases");
open(CMD, $cmd) or die "Couldn't $cmd: $!\n";
my @databases;
my $header = <CMD>;
while ( <CMD> ) {
s/[\r\n]$//g;
#print "$_\n";
push (@databases, $_);
}
close(CMD);

#print "@databases";

my %colmap = ( 'Data_length' => 6,
'Index_length' => 8,
'Engine' => 1,
'Comment' => 17 );

my %size;
my %total_size;
my %engine_map;

my $inno_db_free;
foreach my $db (@databases) {
print STDERR ".";
$cmd = mysql_cmd("use $db; show table status");

open(CMD, $cmd) or die "Couldn't $cmd: $!\n";
my $header = <CMD>;
my $total_size = 0;
if (defined($header)) {
$header =~ s/[\r\n]$//g;
my @head = split("\t", $header);

foreach my $col (keys %colmap) {
die "$db: Expected '$col', found '" . $head[$colmap{$col}] . "'"
if $head[$colmap{$col}] ne $col;
}

while (<CMD>) {
my @data = split("\t");
my ($data_length, $index_length) = @data[6,8];
my ($engine, $comment) = @data[1,17];
$engine_map{$engine}++;
$size{$db}{$engine} += $data_length + $index_length;
$total_size{$db} += $data_length + $index_length;

if ( $comment =~ /InnoDB free: (\d+) kB/ ) {
die "Found two different inno DB free sized.\n"
if defined($inno_db_free) && $inno_db_free != $1;
$inno_db_free = $1;
}
}
close(CMD);
}
}
print STDERR "\n";

print "NOTE: All numbers are in megabytes (M).\n";
printf("Inno DB free: %.1f\n", $inno_db_free / 1024)
if defined($inno_db_free);

printf("%-30s ", "database");
foreach my $engine (sort keys(%engine_map)) {
printf "%7s ", $engine;
}
printf "%8s", "total";
print "\n";

foreach my $db (sort {$total_size{$b} <=> $total_size{$a}} keys %total_size) {
printf("%-30s ", $db);
foreach my $engine (sort keys(%engine_map)) {
my $size= $size{$db}{$engine};
$size = 0 if !defined($size);
printf("%7.1f ", $size / 1024 / 1024);
}
printf("%8.1f\n", $total_size{$db} / 1024 / 1024);
}

sub mysql_cmd {
my $mysql_cmd = shift;

return "mysql -uroot -h$host -p$pw -e '$mysql_cmd'|";
}

Example output:

% ./db-space.pl -p ...
....................
NOTE: All numbers are in megabytes (M).
Inno DB free: 10755.0
database HEAP InnoDB MyISAM total
tldan 0.0 339.1 720.3 1059.4
ml3test7 0.0 1010.8 0.0 1010.8
ml3test6 0.0 930.4 0.0 930.4
test 0.0 655.4 0.0 655.4
blarg4 0.0 39.5 0.0 39.5

  Posted by Marc Zizka on January 6, 2006
For InnoDB tables, the Comment field of SHOW TABLE STATUS is useful for extracting foreign key information for older versions of MySQL. For versions since 5.0.6, you can query INFORMATION_SCHEMA. (See http://dev.mysql.com/doc/refman/5.0/en/key-column-usage-table.html)

The way the foreign key info is stored in the Comment field can be a pain to parse. Here's a snippet of PHP code that shows how to do this.


<?php
//DB connection already established
$res mysql_query("SHOW TABLE STATUS LIKE 'MY_TABLE'");
$row mysql_fetch_assoc($res);
mysql_free_result($res);
$commentArr preg_split('/; */'$row['Comment']);

$foreignKeyArr = array(); //<-- We want to fill this.

foreach($commentArr as $comment) {
   
//Only work on InnoDB foreign key info.
   
if(preg_match(
         
'/\(`(.*)`\) REFER `(.*)\/(.*)`\(`(.*)`\)/',
         
$comment,
         
$matchArr)) {
   
$primaryKeyFieldArr preg_split('/` `/'matchArr[1]);
   
$foreignKeyDatabase $matchArr[2];
   
$foreignKeyTable $matchArr[3];
   
$foreignKeyFieldArr preg_split('/` `/'$matchArr[4]);

   for(
$i 0$i count($primaryKeyFieldArr); $i++) {
      
$foreignKeyArr$primaryKeyFieldArr[$i] ] = array(
         
'db' => $foreignKeyDatabase,
         
'table' => $foreignKeyTable,
         
'field' => $foreignKeyFieldArr[$i]);
   }
}
?>


Now $foreignKeyArr holds a list of fields from MY_TABLE
that have a foreign key constraint. If MY_FK is a foreign
key referencing YOUR_ID in YOUR_TABLE, you will get:

$foreignKeyArr['MY_FK']['db'] == 'THIS_DATABASE'
$foreignKeyArr['MY_FK']['table'] == 'YOUR_TABLE'
$foreignKeyArr['MY_FK']['field'] == 'YOUR_ID'

  Posted by Brian Robinson on August 25, 2006
If you are REALLY desperate to get FK relationships you can always use a bit of JAVA code.
I know you Perl guys will balk at this - but the JDBC METADATA can give you this information quite easily.
maybe there is something similar for Perl DBI?
Yes!
http://search.cpan.org/src/TIMB/DBI_AdvancedTalk_2004/sld086.htm

  Posted by Eric Brunson on February 5, 2007
Or you can read the foreign key relationships out of the information_schema. Java's not magic, you know, all that info is in there to be used by anything that can read it. ;-)
  Posted by andrew taylor on May 19, 2007
A handy one liner to get the total table size...requires ruby

mysqlshow -u <user> --password=<password> --status <dbname> | ruby -e 'puts STDIN.readlines[4..-2].inject(0) {|s,e| s += e.split("|")[7].to_i}'
  Posted by Scott Ripley on May 24, 2007
I've amended the above PHP script to format the output for an HTML table.


<?php

print('<table cols="6"><th>Table</th><th>Data Size</th><th>Index Size</th><th>Total size</th><th>Total Rows</th><th>Avg. Size per Row</th>');
mysql_connect("localhost","my_user","password");
$result mysql_query("SHOW TABLE STATUS FROM test;");

while(
$array mysql_fetch_array($result)) {
$total $array[Data_length]+$array[Index_length];

if ( 
$array[Data_length] > ) {

    print(
'<tr><td align="center">');

    print(
' ' $array[Name] . '<br /></td><td align="center">');

if ( 
$array[Data_length] < 1024 ) {
        echo 
' '.$array[Data_length].'</td><td align="center">';
        } elseif ( (
$array[Data_length] > 1024) && ($array[Data_length] < 1048576 ) ) {
        
printf('%.0fK',($array[Data_length] / 1024) );    
        print(
'</td><td align="center">');
        } elseif ( 
$array[Data_length] >= 1048576 ) {
        
printf('%.2fMB',($array[Data_length] / 1048576) );
        print(
'</td><td align="center">');

        }

if ( 
$array[Index_length] < 1024 ) {
        echo 
' '.$array[Index_length].'<br /></td><td align="center">';
        } elseif ( (
$array[Index_length] > 1024) && ($array[Index_length] < 1048576 ) ) {
        
printf('%.0fK',($array[Index_length] / 1024) );    
        print(
'<br /></td><td align="center">');
        } elseif ( 
$array[Index_length] >= 1048576 ) {
        
printf('%.2fMB',($array[Index_length] / 1048576) );
        print(
'<br /></td><td align="center">');

        }
if ( 
$total 1024 ) {
        echo 
' '.$total.'<br /></td><td align="center">';
        } elseif ( (
$total 1024) && ($total 1048576 ) ) {
        
printf('%.0fK',($total 1024) );    
        print(
'<br /></td><td align="center">');
        } elseif ( 
$total >= 1048576 ) {
        
printf('%.2fMB',($total 1048576) );
        print(
'<br /></td><td align="center">');

        }    
                
echo 
'        
 '
.$array[Rows].'</td><td align="center">
 '
.$array[Avg_row_length].'</td></tr>
'
;
}

}

?>

  Posted by Vasil Dimov on December 11, 2007
Since MySQL 5.1.23 the InnoDB free space that was present in INFORMATION_SCHEMA.TABLES.TABLE_COMMENT and in "SHOW ..." is moved to INFORMATION_SCHEMA.TABLES.DATA_FREE. The value is in kilobytes. Programs that parse TABLE_COMMENT need to be adjusted. See http://bugs.mysql.com/32440
  Posted by Marcos Gil Fuertes on February 7, 2008
To Marc Zizka:

I tried your script BUT got a problem with "SHOW TABLE STATUS". It only returns the first foreign key (in MySql 5.0.27).

Instead of it, I'm using "SHOW CREATE TABLE" and this regular expression:

'/FOREIGN KEY \(`(.*)`\) REFERENCES `(.*)` \(`(.*)`\)/'

I'm assuming that all the references are located in the same database.
  Posted by Ivan Cachicatari on February 29, 2012
You can found a custom SHOW TABLE STATUS command based on INFORMATION_SCHEMA database at:
http://en.latindevelopers.com/ivancp/2012/a-better-show-table-status/
That stored procedure returns a result like this:

+----------------------------+--------+-------+---------+-----------------+
| Table Name | Engine | Rows | Size | Collation |
+----------------------------+--------+-------+---------+-----------------+
| actor | InnoDB | 200 | 0.03 Mb | utf8_general_ci |
| actor_info | [VIEW] | - | - | - |
| address | InnoDB | 589 | 0.09 Mb | utf8_general_ci |
| category | InnoDB | 16 | 0.02 Mb | utf8_general_ci |
| city | InnoDB | 427 | 0.06 Mb | utf8_general_ci |
| country | InnoDB | 109 | 0.02 Mb | utf8_general_ci |
| customer | InnoDB | 541 | 0.12 Mb | utf8_general_ci |
...

  Posted by NOT_FOUND NOT_FOUND on July 2, 2014
MySQL 5.6 finally speeds up SHOW TABLE STATUS in cases where it used to perform miserably. Example for one of our databases containing 112 InnoDB tables, some of which have millions of rows:

MySQL 5.5.30: 32 seconds
MySQL 5.6.16: 0.3 seconds
Sign Up Login You must be logged in to post a comment.