MySQL 字段信息统计机制
一、表信息更新的基本逻辑
默认情况下,MySQL 会高效的从 系统表 mysql.index_stats
和 mysql.table_stats
中检索这些列的缓存值,而不是直接从存储引擎中获取统计信息。如果缓存的统计信息不可用或已过期,MySQL 将从存储引擎中检索最新的统计信息,并将其统计信息更新并缓存在 mysql.index_stats
和 mysql.table_stats
字典表中。后续查询将检索缓存的统计信息,直到缓存的统计数据过期。
二、机制重要控制参数
参数 information_schema_stats_expiry
默认是 86400 秒。也就是说每隔一天自动收集一次相关统计信息到 information_schema
中,
如下表字段中:
STATISTICS.CARDINALITY
TABLES.AUTO_INCREMENT
TABLES.AVG_ROW_LENGTH
TABLES.CHECKSUM
TABLES.CHECK_TIME
TABLES.CREATE_TIME
TABLES.DATA_FREE
TABLES.DATA_LENGTH
TABLES.INDEX_LENGTH
TABLES.MAX_DATA_LENGTH
TABLES.TABLE_ROWS
TABLES.UPDATE_TIME
参数 information_schema_stats_expiry
的值决定再次收集表的统计信息的时间间隔,默认 86400 秒。如果设置为 0 ,则表示实时更新统计信息,当然势必会影响一部分性能。
在以下情况中,查询统计信息列不会在 mysql.index_stats
和 mysql.table_stats
字典表中存储或更新统计信息:
- 缓存的统计信息尚未过期时。
- 当
information_schema_stas_expiry
设置为 0 时。 - 当 MySQL server 处于只读、超级只读、事务只读或
innodb_read_only
模式时。 - 查询还获取
Performance Schema
的数据时。
注意事项:
1、information_schema_stas_experity
支持全局和会话级别,每个会话都可以定义自己的过期值。从存储引擎中检索并由一个会话缓存的统计信息可用于其他会话。
2、MySQL 重新启动或第一次打开 mysql.index_stats
和 mysql.table_stats
表不会自动更新缓存的统计信息。