• 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  参数

  • 相关阅读:
    【Beta阶段】第六次scrum meeting
    【Beta阶段】第五次scrum meeting
    【Beta阶段】第四次scrum meeting
    【Beta阶段】第三次scrum meeting
    【Beta阶段】第二次scrum meeting
    团队作业4——第一次项目冲刺(Alpha版本) 日志集合处
    团队作业10——Beta版本事后诸葛亮
    Beta阶段项目复审
    团队作业9——展示博客(Beta版本)
    团队作业9——测试与发布(Beta版本)
  • 原文地址:https://www.cnblogs.com/ziroro/p/9948103.html
Copyright © 2020-2023  润新知