The innodb_table_stats
table contains one row for each table. The following example demonstrates the type of data collected.
Table t1
contains a primary index (columns a
, b
) secondary index (columns c
, d
), and unique index (columns e
, f
):
CREATE TABLE t1 ( a INT, b INT, c INT, d INT, e INT, f INT, PRIMARY KEY (a, b), KEY i1 (c, d), UNIQUE KEY i2uniq (e, f) ) ENGINE=INNODB;
After inserting five rows of sample data, table t1
appears as follows:
mysql> SELECT * FROM t1;
+---+---+------+------+------+------+
| a | b | c | d | e | f |
+---+---+------+------+------+------+
| 1 | 1 | 10 | 11 | 100 | 101 |
| 1 | 2 | 10 | 11 | 200 | 102 |
| 1 | 3 | 10 | 11 | 100 | 103 |
| 1 | 4 | 10 | 12 | 200 | 104 |
| 1 | 5 | 10 | 12 | 100 | 105 |
+---+---+------+------+------+------+
To immediately update statistics, run ANALYZE TABLE
(if innodb_stats_auto_recalc
is enabled, statistics are updated automatically within a few seconds assuming that the 10% threshold for changed table rows is reached):
mysql> ANALYZE TABLE t1;
+---------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+---------+---------+----------+----------+
| test.t1 | analyze | status | OK |
+---------+---------+----------+----------+
Table statistics for table t1
show the last time InnoDB
updated the table statistics (2014-03-14 14:36:34
), the number of rows in the table (5
), the clustered index size (1
page), and the combined size of the other indexes (2
pages).
mysql> SELECT * FROM mysql.innodb_table_stats WHERE table_name like 't1'\G
*************************** 1. row ***************************
database_name: test
table_name: t1
last_update: 2014-03-14 14:36:34
n_rows: 5
clustered_index_size: 1
sum_of_other_index_sizes: 2
The innodb_index_stats
table contains multiple rows for each index. Each row in the innodb_index_stats
table provides data related to a particular index statistic which is named in the stat_name
column and described in the stat_description
column. For example:
mysql>SELECT index_name, stat_name, stat_value, stat_description
FROM mysql.innodb_index_stats WHERE table_name like 't1';
+------------+--------------+------------+-----------------------------------+ | index_name | stat_name | stat_value | stat_description | +------------+--------------+------------+-----------------------------------+ | PRIMARY | n_diff_pfx01 | 1 | a | | PRIMARY | n_diff_pfx02 | 5 | a,b | | PRIMARY | n_leaf_pages | 1 | Number of leaf pages in the index | | PRIMARY | size | 1 | Number of pages in the index | | i1 | n_diff_pfx01 | 1 | c | | i1 | n_diff_pfx02 | 2 | c,d | | i1 | n_diff_pfx03 | 2 | c,d,a | | i1 | n_diff_pfx04 | 5 | c,d,a,b | | i1 | n_leaf_pages | 1 | Number of leaf pages in the index | | i1 | size | 1 | Number of pages in the index | | i2uniq | n_diff_pfx01 | 2 | e | | i2uniq | n_diff_pfx02 | 5 | e,f | | i2uniq | n_leaf_pages | 1 | Number of leaf pages in the index | | i2uniq | size | 1 | Number of pages in the index | +------------+--------------+------------+-----------------------------------+
The stat_name
column shows the following types of statistics:
size
: Where stat_name
=size
, the stat_value
column displays the total number of pages in the index.
n_leaf_pages
: Where stat_name
=n_leaf_pages
, the stat_value
column displays the number of leaf pages in the index.
n_diff_pfx
: Where NN
stat_name
=n_diff_pfx01
, the stat_value
column displays the number of distinct values in the first column of the index. Where stat_name
=n_diff_pfx02
, the stat_value
column displays the number of distinct values in the first two columns of the index, and so on. Where stat_name
=n_diff_pfx
, the NN
stat_description
column shows a comma separated list of the index columns that are counted.
To further illustrate the n_diff_pfx
statistic, which provides cardinality data, consider once again the NN
t1
table example that was introduced previously. As shown below, the t1
table is created with a primary index (columns a
, b
), a secondary index (columns c
, d
), and a unique index (columns e
, f
):
CREATE TABLE t1 ( a INT, b INT, c INT, d INT, e INT, f INT, PRIMARY KEY (a, b), KEY i1 (c, d), UNIQUE KEY i2uniq (e, f) ) ENGINE=INNODB;
After inserting five rows of sample data, table t1
appears as follows:
mysql> SELECT * FROM t1;
+---+---+------+------+------+------+
| a | b | c | d | e | f |
+---+---+------+------+------+------+
| 1 | 1 | 10 | 11 | 100 | 101 |
| 1 | 2 | 10 | 11 | 200 | 102 |
| 1 | 3 | 10 | 11 | 100 | 103 |
| 1 | 4 | 10 | 12 | 200 | 104 |
| 1 | 5 | 10 | 12 | 100 | 105 |
+---+---+------+------+------+------+
When you query the index_name
, stat_name
, stat_value
, and stat_description
, where stat_name LIKE 'n_diff%'
, the following result set is returned:
mysql>SELECT index_name, stat_name, stat_value, stat_description
FROM mysql.innodb_index_stats
WHERE table_name like 't1' AND stat_name LIKE 'n_diff%';
+------------+--------------+------------+------------------+ | index_name | stat_name | stat_value | stat_description | +------------+--------------+------------+------------------+ | PRIMARY | n_diff_pfx01 | 1 | a | | PRIMARY | n_diff_pfx02 | 5 | a,b | | i1 | n_diff_pfx01 | 1 | c | | i1 | n_diff_pfx02 | 2 | c,d | | i1 | n_diff_pfx03 | 2 | c,d,a | | i1 | n_diff_pfx04 | 5 | c,d,a,b | | i2uniq | n_diff_pfx01 | 2 | e | | i2uniq | n_diff_pfx02 | 5 | e,f | +------------+--------------+------------+------------------+
For the PRIMARY
index, there are two n_diff%
rows. The number of rows is equal to the number of columns in the index.
For nonunique indexes, InnoDB
appends the columns of the primary key.
Where index_name
=PRIMARY
and stat_name
=n_diff_pfx01
, the stat_value
is 1
, which indicates that there is a single distinct value in the first column of the index (column a
). The number of distinct values in column a
is confirmed by viewing the data in column a
in table t1
, in which there is a single distinct value (1
). The counted column (a
) is shown in the stat_description
column of the result set.
Where index_name
=PRIMARY
and stat_name
=n_diff_pfx02
, the stat_value
is 5
, which indicates that there are five distinct values in the two columns of the index (a,b
). The number of distinct values in columns a
and b
is confirmed by viewing the data in columns a
and b
in table t1
, in which there are five distinct values: (1,1
), (1,2
), (1,3
), (1,4
) and (1,5
). The counted columns (a,b
) are shown in the stat_description
column of the result set.
For the secondary index (i1
), there are four n_diff%
rows. Only two columns are defined for the secondary index (c,d
) but there are four n_diff%
rows for the secondary index because InnoDB
suffixes all nonunique indexes with the primary key. As a result, there are four n_diff%
rows instead of two to account for the both the secondary index columns (c,d
) and the primary key columns (a,b
).
Where index_name
=i1
and stat_name
=n_diff_pfx01
, the stat_value
is 1
, which indicates that there is a single distinct value in the first column of the index (column c
). The number of distinct values in column c
is confirmed by viewing the data in column c
in table t1
, in which there is a single distinct value: (10
). The counted column (c
) is shown in the stat_description
column of the result set.
Where index_name
=i1
and stat_name
=n_diff_pfx02
, the stat_value
is 2
, which indicates that there are two distinct values in the first two columns of the index (c,d
). The number of distinct values in columns c
an d
is confirmed by viewing the data in columns c
and d
in table t1
, in which there are two distinct values: (10,11
) and (10,12
). The counted columns (c,d
) are shown in the stat_description
column of the result set.
Where index_name
=i1
and stat_name
=n_diff_pfx03
, the stat_value
is 2
, which indicates that there are two distinct values in the first three columns of the index (c,d,a
). The number of distinct values in columns c
, d
, and a
is confirmed by viewing the data in column c
, d
, and a
in table t1
, in which there are two distinct values: (10,11,1
) and (10,12,1
). The counted columns (c,d,a
) are shown in the stat_description
column of the result set.
Where index_name
=i1
and stat_name
=n_diff_pfx04
, the stat_value
is 5
, which indicates that there are five distinct values in the four columns of the index (c,d,a,b
). The number of distinct values in columns c
, d
, a
and b
is confirmed by viewing the data in columns c
, d
, a
, and b
in table t1
, in which there are five distinct values: (10,11,1,1
), (10,11,1,2
), (10,11,1,3
), (10,12,1,4
), and (10,12,1,5
). The counted columns (c,d,a,b
) are shown in the stat_description
column of the result set.
For the unique index (i2uniq
), there are two n_diff%
rows.
Where index_name
=i2uniq
and stat_name
=n_diff_pfx01
, the stat_value
is 2
, which indicates that there are two distinct values in the first column of the index (column e
). The number of distinct values in column e
is confirmed by viewing the data in column e
in table t1
, in which there are two distinct values: (100
) and (200
). The counted column (e
) is shown in the stat_description
column of the result set.
Where index_name
=i2uniq
and stat_name
=n_diff_pfx02
, the stat_value
is 5
, which indicates that there are five distinct values in the two columns of the index (e,f
). The number of distinct values in columns e
and f
is confirmed by viewing the data in columns e
and f
in table t1
, in which there are five distinct values: (100,101
), (200,102
), (100,103
), (200,104
), and (100,105
). The counted columns (e,f
) are shown in the stat_description
column of the result set.