ablog

不器用で落着きのない技術者のメモ

MySQL の InnoDB テーブルの統計情報を確認する

MySQLInnoDB テーブルにどんな統計情報があるのか調べてみた。MySQL 5.6 にはテーブル統計とインデックス統計だけで、MySQL 8.0 からヒストグラム*1が入るらしい。

  • テーブル定義
mysql> desc mydb.sbtest1;
+-------+-----------+------+-----+---------+----------------+
| Field | Type      | Null | Key | Default | Extra          |
+-------+-----------+------+-----+---------+----------------+
| id    | int(11)   | NO   | PRI | NULL    | auto_increment |
| k     | int(11)   | NO   | MUL | 0       |                |
| c     | char(120) | NO   |     |         |                |
| pad   | char(60)  | NO   |     |         |                |
+-------+-----------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
  • テーブル統計
mysql> select * from mysql.innodb_table_stats where table_name = 'sbtest1';
+---------------+------------+---------------------+--------+----------------------+--------------------------+
| database_name | table_name | last_update         | n_rows | clustered_index_size | sum_of_other_index_sizes |
+---------------+------------+---------------------+--------+----------------------+--------------------------+
| mydb          | sbtest1    | 2018-06-10 20:39:25 |      1 |                    1 |                        1 |
+---------------+------------+---------------------+--------+----------------------+--------------------------+
1 row in set (0.00 sec)
  • インデックス統計
mysql> select * from mysql.innodb_index_stats where table_name = 'sbtest1';
+---------------+------------+------------+---------------------+--------------+------------+-------------+-----------------------------------+
| database_name | table_name | index_name | last_update         | stat_name    | stat_value | sample_size | stat_description                  |
+---------------+------------+------------+---------------------+--------------+------------+-------------+-----------------------------------+
| mydb          | sbtest1    | PRIMARY    | 2018-06-10 20:39:25 | n_diff_pfx01 |          1 |           1 | id                                |
| mydb          | sbtest1    | PRIMARY    | 2018-06-10 20:39:25 | n_leaf_pages |          1 |        NULL | Number of leaf pages in the index |
| mydb          | sbtest1    | PRIMARY    | 2018-06-10 20:39:25 | size         |          1 |        NULL | Number of pages in the index      |
| mydb          | sbtest1    | k_1        | 2018-06-10 20:39:25 | n_diff_pfx01 |          1 |           1 | k                                 |
| mydb          | sbtest1    | k_1        | 2018-06-10 20:39:25 | n_diff_pfx02 |          1 |           1 | k,id                              |
| mydb          | sbtest1    | k_1        | 2018-06-10 20:39:25 | n_leaf_pages |          1 |        NULL | Number of leaf pages in the index |
| mydb          | sbtest1    | k_1        | 2018-06-10 20:39:25 | size         |          1 |        NULL | Number of pages in the index      |
+---------------+------------+------------+---------------------+--------------+------------+-------------+-----------------------------------+
7 rows in set (0.00 sec)

参考

一体いつ変わったのかリリースノートにも全然書いてないんだけど、 mysql.column_statistics に名前が変わってシステムテーブルとして直接参照が不可能に、中身を覗くには information_schema.column_statistics に名前が変わっていた。

日々の覚書: MySQL 8.0.0でついにヒストグラムがサポートされるらしい(が、自動で統計してくれるわけではない様子)

*1:Oracle Database で言う列統計とヒストグラム