以前に筆者が担当した第186回 information_
INNODB_TABLESTATS
ビュー
INNODB_
ビューから、InnoDBテーブルに関する統計情報のステータスを確認できます。まずは、簡単にこのビューのカラムとその意味について紹介します。
NAME
…INNODB_
.TABLES NAME
と同様のテーブル名STATS_
… 統計情報が収集されている場合はINITIALIZED Initialized
、されていない場合はUninitialized
NUM_
… 統計情報で推定されたテーブルの行数ROWS CLUST_
… 統計情報で推定されたクラスターインデックスのページ数INDEX_ SIZE OTHER_
… 統計情報で推定されたセカンダリーインデックスのページ数INDEX_ SIZE MODIFIED_
… 前回統計情報が収集されてから更新された行数COUNTER AUTOINC
… 現在のオートインクリメント値REF_
… カウンタがゼロになると、テーブルメタデータをテーブルキャッシュから削除COUNT
mysql> SELECT * FROM INNODB_TABLESTATS WHERE NAME='test/t1'\G *************************** 1. row *************************** TABLE_ID: 1065 NAME: test/t1 STATS_INITIALIZED: Initialized NUM_ROWS: 19 CLUST_INDEX_SIZE: 1 OTHER_INDEX_SIZE: 0 MODIFIED_COUNTER: 0 AUTOINC: 23 REF_COUNT: 2 1 row in set (0.00 sec)
統計情報は、オプティマイザーがクエリの実行計画を作成するときに利用されます。また、デフォルトでは自動統計情報収集が有効になっています。有効の場合、統計情報を収集するタイミングは以下のとおりです。
- テーブル全体の10%を超える行の更新
- ANALYZE TABLEを実行
また、最後に統計情報を収集した時間は、mysql.
またはmysql.
テーブルのlast_
カラムから確認できます。
SELECT database_name,table_name,last_update FROM mysql.innodb_table_stats WHERE table_name='t1'; +---------------+------------+---------------------+ | database_name | table_name | last_update | +---------------+------------+---------------------+ | test | t1 | 2023-01-20 09:45:22 | +---------------+------------+---------------------+ 1 row in set (0.00 sec)
INNODB_
ビューは普段参照することはないでしょう。唯一このビューだけが持つ情報として興味深いのは、MODIFIED_
カラムの値だと思います。この値は前回統計情報を収集してから変更された行数です。前述で、NUM_
の10%を超えると統計情報が収集されます。また、一度統計情報が収集されると、値は0にリセットされます。last_
が古いテーブルに対して、現在までにどれだけの変更がテーブルに行われていたかの、ざっくりな把握はできると思います。しかし、これといって使いどころはありませんので、参考程度に覚えておくだけでいいでしょう。
INNODB_COLUMNS
テーブル
INNODB_
テーブルはInnoDBのカラムに関する情報を確認できます。カラムの情報は主にinformation_
テーブルを参照する方が多いでしょう。そのほうがわかりやすいので、筆者もそうしています。しかし、このINNODB_
テーブルからのみ確認できる情報があり、それはALGORITHM=INSTANT
で追加されたカラム
インスタントカラムはMySQL 8.ALTER TABLE t1 ADD col2 int AFTER col1
)。
INNODB_
テーブルのHAS_
から、どのテーブルのカラムがインスタントカラムなのか確認することができます。値が1
であれば、インスタントカラムであり、0
であれば通常のカラムとなっています。例として、test.
テーブルにcol1
カラムをインスタントカラムとして追加し確認してみましょう。
mysql> ALTER TABLE test.t2 ADD col1 int AFTER id, ALGORITHM=INSTANT; Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SELECT TABLE_ID,NAME,POS,HAS_DEFAULT FROM INNODB_COLUMNS WHERE TABLE_ID=1069; +----------+------+-----+-------------+ | TABLE_ID | NAME | POS | HAS_DEFAULT | +----------+------+-----+-------------+ | 1069 | id | 0 | 0 | | 1069 | col1 | 1 | 1 | +----------+------+-----+-------------+ 2 rows in set (0.01 sec)
また、インスタントカラムはテーブル再構築を伴うDDLやOPTIMIZE TABLEなどを実行すると、テーブルの再構築によりテーブルIDが変わり、インスタントカラムから通常カラムへと変更されます。
mysql> ALTER TABLE test.t2 ADD col2 int AFTER id, ALGORITHM=INPLACE; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SELECT TABLE_ID,NAME,POS,HAS_DEFAULT FROM INNODB_COLUMNS WHERE TABLE_ID=1070; +----------+------+-----+-------------+ | TABLE_ID | NAME | POS | HAS_DEFAULT | +----------+------+-----+-------------+ | 1070 | id | 0 | 0 | | 1070 | col2 | 1 | 0 | | 1070 | col1 | 2 | 0 | +----------+------+-----+-------------+
運用中にインスタントカラムかどうか確認することは少ないと思います。ただし、新機能であるために、その他の処理と組み合わさってバグを踏むこともあるでしょう。そのときはここを確認することもあると思います。
INNODB_TABLESPACES
テーブル
INNODB_
テーブルはInnoDBテーブルスペースに関するメタデータを参照することができます。
以前の記事 第56回 InnoDBテーブルサイズのいろいろな確認方法 にてこのテーブルを用いた実際のファイルサイズの見方を紹介していますので、ご確認ください。MySQL 5.INNODB_
テーブルでしたが、MySQL 8.INNODB_
テーブルにテーブル名が変更されています。
MySQL 8.INNODB_
テーブルでは以下のようなカラムが追加され、確認できる項目が増えています。
AUTOEXTEND_
… テーブルスペースの自動拡張サイズSIZE ENCRYPTION
… テーブルスペースが暗号化されているかどうか
まとめ
今回はあまり実用的な内容ではなかったかもしれませんが、知っておいて損はない情報を紹介しました。 紹介したテーブルに関する公式ドキュメント次のとおりです。こちらも合わせてご参照いただければと思います。