InnoDB 统计信息

一、InnoDB 统计信息的两种情况

  • 持久化统计信息:重启MySQL时,统计信息不丢失
  • 非持久化统计信息:重启MySQL时,统计信息丢失

两种情况下,保存的方式,收集的条件,采样率都不一样,接下来介绍持久化跟非持久化的不同。

 

二、持久化统计信息

2.1 持久化统计信息保存在哪?

 

  • 当  innodb_stats_persistent = ON,默认开启
  • 创建表的时候指定 STATS_PERSISTENT=1

 

MySQL收集的统计信息会保存在以下两种表

  • mysql.innodb_table_stats
  • mysql.innodb_index_stats

 

2.2 何时收集持久化统计信息?

  • 当 innodb_stats_auto_recalc = ON,默认开启
  • 创建表时指定 STATS_AUTO_RECALC=1。
  • 表数据变化超过10%时,触发自动收集。
  • 但是可能会有延迟几秒,并不会马上触发收集。

 

2.3 采样率

  • 统计信息收集是采样分析,默认是20个 page,由 innodb_stats_persistent_sample_pages 参数控制。
  • 如果统计信息相差太多,可以增加这个参数,不过 ANAYLZE TABLE 收集的时间会增加。
  • 也可以在创建表的时候指定 STATS_SAMPLE_PAGES。
  • 如果感觉自动收集的统计信息不准时,甚至可以直接修改  mysql.innodb_table_stats 和 mysql.innodb_index_stats。修改完 flush table tbl_name 就可以了。

 

三、非持久化统计信息

3.1 非持久化统计信息保存在哪?

保存在内存中,重启就失效了

 

3.2 何时收集非持久化统计信息

  • ANALYZE TABLE
  • innodb_stats_on_metadata = 1(该参数只有 innodb_stats_persistent =OFF 才生效)。启用 innodb_stats_on_metadata 可能会降低性能
    • 执行 SHOW TABLE STATUS, SHOW INDEX
    • 查询 INFORMATION_SCHEMA.TABLES 或 INFORMATION_SCHEMA.STATISTICS 表
  • mysql客户端使用了 --auto-rehash,该 auto-rehash 选项会导致所有InnoDB表被打开,并且打开表操作会导致重新计算统计信息。建议禁用该操作 auto-rehash,使用参数 --disable-auto-rehash 禁用。
  • 第一次打开表
  • InnoDB 检测自上次更新统计信息以来表已修改了1/16。

 

3.3 采样率

 

默认的采样 page 是 8,由参数 innodb_stats_transient_sample_pages 控制 

 

四、手动收集统计信息

手动收集统计信息使用

analyze table tbl_name。

如果发现执行计划内的统计信息有问题,可以手动收集,如果还是手动收集的不准,可以调整下参数采样参数。

innodb_stats_persistent = ON。调整 innodb_stats_persistent_sample_pages 参数

innodb_stats_persistent = OFF。调整 innodb_stats_transient_sample_pages  参数

 

posted @ 2018-11-13 10:13  Ziroro  阅读(809)  评论(0编辑  收藏  举报