日々更新されるテーブルは、
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構文を使用することで統計情報を再取得できます。