日々更新されるテーブルは、
TABLESテーブル
はじめに、
mysql> SELECT TABLE_NAME,ENGINE,DATA_LENGTH,INDEX_LENGTH,DATA_FREE FROM information_schema.tables WHERE TABLE_NAME = 't0'; +------------+--------+-------------+--------------+-----------+ | TABLE_NAME | ENGINE | DATA_LENGTH | INDEX_LENGTH | DATA_FREE | +------------+--------+-------------+--------------+-----------+ | t0 | InnoDB | 26804224 | 15253504 | 4194304 | +------------+--------+-------------+--------------+-----------+
DATA_
カラム … 主キー領域を含むテーブルサイズLENGTH INDEX_
カラム … セカンダリインデックスのサイズLENGTH DATA_
カラム … 空き領域FREE
上記をバイト単位で確認することができます。
これらの値はInnoDBのページ単位で増加するため、
SHOW TABLE STATUS 構文
もうひとつ一般的な方法として、SHOW TABLE STATUS
構文を使用することで確認できます。ここで表示されるものは、information_
テーブルと同じものです。
以下のように、LIKE
やWHERE name = ?
を使用することで特定のテーブルを指定することもできます。
<表示一部割愛> mysql> show table status from db1 like 't0'\G *************************** 1. row *************************** Name: t0 Engine: InnoDB Data_length: 26804224 Index_length: 15253504 Data_free: 4194304
INNODB_SYS_TABLESPACESテーブル
これは、
MySQL5.ALLOCATED_
カラムから、
また、innodb_
でなければ表示されません。innodb_
mysql> SELECT NAME,FILE_SIZE,ALLOCATED_SIZE FROM information_schema.innodb_sys_tablespaces WHERE NAME LIKE '%t0%'; +-------+-----------+----------------+ | NAME | FILE_SIZE | ALLOCATED_SIZE | +-------+-----------+----------------+ | db/t0 | 50331648 | 50335744 | +-------+-----------+----------------+ 1 row in set (0.00 sec)
NAME
カラム…テーブル名。データベース名/テーブル名のように表記されます。FILE_
カラム…圧縮前のファイルサイズSIZE (バイト単位) ALLOCATED_
カラム…実際にディスクに割り当てられたibdファイルサイズSIZE (バイト単位)
ここの圧縮というのはMySQL5.FILE_
とALLOCATED_
カラムの値の差を比較すると、
「透過的ページ圧縮」t1
の例
mysql> SELECT NAME,FILE_SIZE,ALLOCATED_SIZE FROM information_schema.innodb_sys_tablespaces WHERE NAME LIKE '%t1%'; +-------+-----------+----------------+ | NAME | FILE_SIZE | ALLOCATED_SIZE | +-------+-----------+----------------+ | db/t1 | 50331648 | 21295104 | +-------+-----------+----------------+
また、row_
で作成された場合は、FILE_
とALLOCATED_
カラムはすでに圧縮された値になります。
INNODB_SYS_TABLESTATSビュー
これはテーブルではなく、
ページ数なので、
mysql> SELECT NAME,CLUST_INDEX_SIZE,OTHER_INDEX_SIZE FROM information_schema.innodb_sys_tablestats WHERE NAME LIKE '%t0%'; +-------+------------------+------------------+ | NAME | CLUST_INDEX_SIZE | OTHER_INDEX_SIZE | +-------+------------------+------------------+ | db/t0 | 1636 | 803 | +-------+------------------+------------------+
NAME
カラム…テーブル名。INNODB_SYS_ TABLESPACESテーブルと同様です。 CLUST_
カラム…主キーを含むテーブルサイズINDEX_ SIZE (ページ単位) OTHER_
カラム…セカンダリーインデックスのサイズINDEX_ SIZE (ページ単位)
innodb_table_statsテーブル
mysqlデータベース内のテーブルです。ここからも、
mysql> SELECT database_name,table_name,clustered_index_size,sum_of_other_index_sizes FROM mysql.innodb_table_stats WHERE database_name = 'oo' AND table_name = 't0'; +---------------+------------+----------------------+--------------------------+ | database_name | table_name | clustered_index_size | sum_of_other_index_sizes | +---------------+------------+----------------------+--------------------------+ | oo | t0 | 1636 | 803 | +---------------+------------+----------------------+--------------------------+
database_
カラム…データベース名name table_
カラム…テーブル名name clustered_
カラム…主キーを含むテーブルサイズindex_ size (ページ単位) sum_
カラム…セカンダリーインデックスのサイズof_ other_ index_ sizes (ページ単位)
まとめ
今回はInnoDBのテーブルサイズを確認する5つの方法を紹介しました。それぞれの方法の違いは以下の表のようにまとめられます。
方法 | 単位 | 概算値/ |
---|---|---|
i_ | バイト | 概算値 |
SHOW TABLE STATUS構文 | バイト | 概算値 |
i_ | バイト | 実測値 |
i_ | ページ | 概算値 |
mysql. | ページ | 概算値 |
※)
これらの方法でテーブルサイズを定期的に監視して、
INNODB_ANALYZE TABLE
構文を使用することで統計情報を再取得できます。