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
表不会自动更新缓存的统计信息。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)