MySQL の InnoDB テーブルにどんな統計情報があるのか調べてみた。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でついにヒストグラムがサポートされるらしい(が、自動で統計してくれるわけではない様子)