MySQL 字段信息统计机制

一、表信息更新的基本逻辑

       默认情况下,MySQL 会高效的从 系统表 mysql.index_statsmysql.table_stats 中检索这些列的缓存值,而不是直接从存储引擎中获取统计信息。如果缓存的统计信息不可用或已过期,MySQL 将从存储引擎中检索最新的统计信息,并将其统计信息更新并缓存在 mysql.index_statsmysql.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_statsmysql.table_stats 字典表中存储或更新统计信息:

  1. 缓存的统计信息尚未过期时。
  2. information_schema_stas_expiry 设置为 0 时。
  3. 当 MySQL server 处于只读、超级只读、事务只读或 innodb_read_only 模式时。
  4. 查询还获取 Performance Schema 的数据时。

注意事项:

   1、information_schema_stas_experity 支持全局和会话级别,每个会话都可以定义自己的过期值。从存储引擎中检索并由一个会话缓存的统计信息可用于其他会话。

         2、MySQL 重新启动或第一次打开 mysql.index_statsmysql.table_stats 表不会自动更新缓存的统计信息。

posted @ 2024-01-22 17:54  xuzhujack  阅读(22)  评论(0编辑  收藏  举报
;