Skip to content

innodb_stats_on_metadata

xiaoboluo768 edited this page Jun 14, 2020 · 2 revisions
  • 该系统参数仅用于非持久化统计信息
    • 当innodb_stats_persistent被禁用(该系统参数是开启持久化统计信息用的)或innodb_stats_persistent参数开启但某表在创建或修改表定义时使用建表选项STATS_PERSISTENT = 0来关闭该表的持久化统计信息时,所有Innodb表或指定了建表选项STATS_PERSISTENT = 0的表的优化器统计信息不会持久存储到磁盘,此时如果启用innodb_stats_on_metadata系统参数,InnoDB会在执行语句(如SHOW TABLE STATUS或SHOW INDEX)或访问INFORMATION_SCHEMA.TABLES、INFORMATION_SCHEMA.STATISTICS表时触发更新非持久性统计信息。(这些更新类似于ANALYZE TABLE触发的统计信息更新),但当禁用innodb_stats_on_metadata系统参数时,InnoDB会在执行可能触发非持久统计信息更新的语句或访问相关表时,不更新非持久化统计信息。禁用该变量在访问大表时可以提高访问速度(小数据量的表建议开启该参数,以提高查询优化器的执行路径判断正确率)。它还可以提高涉及InnoDB表的查询的执行计划的稳定性(开启了这个参数之后执行计划不稳定是因为索引统计信息处于更新状态时,查询优化器可能会忽略这个索引)
    • 触发非持久化统计信息可能的场景有如下一些:
      • analyze table
      • 第一次open table
      • 还有在访问如: information_schema.TABLES、information_schema.STATISTICS、information_schema.PARTITIONS、information_schema.KEY_COLUMN_USAGE、information_schema.TABLE_CONSTRAINTS、information_schema.REFERENTIAL_CONSTRAINTS
      • show table status like ‘%tablename%’ 也会触发更新统计信息的操作
      • show index from tb_name [where key_name='xx']; 也会触发更新统计信息
      • 激活innodb监视器表,如创建innodb_monitor,innodb_lock_monitor表等
      • 表中有大量记录修改时,如:对数据表的DML操作占到表总记录数的十六分之一时
    • 收集主要统计信息:
      • rec_per_key //每一个key,包含多少记录。在存储引擎
      • records_in_table //当前表上,有多少记录。在存储引擎
      • rec_in_range //当前表上,在指定范围上有多少记录
    • 全局变量,动态变量,布尔型,5.6.5及其之前的5.6.x版本默认为ON,5.6.6及其之后的5.6.x版本默认为OFF,5.7.x及其之后的版本默认为OFF,要修改该变量必须有super权限

上一篇:innodb_stats_include_delete_marked | 下一篇:innodb_stats_persistent

Clone this wiki locally