本文共 1736 字,大约阅读时间需要 5 分钟。
innodb_stats_persistent决定两种收集方式
默认为on,指定InnoDB索引统计信息是否保存到磁盘。如果为off,那么在服务器重启或者一些其他操作时会清空之前的统计信息,其实就是清空mysql.innodb_table_stats和mysql.innodb_index_stats表数据。
当下一次表访问时再次重新计算,这可能会导致查询执行计划发生变化。
可以在创建表之前在全局级别设置innodb_stats_persistent,或者使用CREATE TABLE和ALTER TABLE语句的STATS_PERSISTENT子句覆盖系统范围的设置并配置各个表的持久性统计信息。
优化器统计信息内容记录在mysql.innodb_table_stats 和 mysql.innodb_index_stats,其中last_update列记录了统计信息最近一次更新时间,
可以手动修改mysql.innodb_table_stats和mysql.innodb_index_stats表来强制执行特定的查询优化计划,或者在不修改数据库的情况下测试替代计划。
当innodb_stats_persistent启用的情况下,以下参数才有效
innodb_stats_persistent_sample_pages
innodb_stats_auto_recalc
innodb_stats_auto_recalc
默认为on,InnoDB在表中的数据发生较大变化后自动重新计算持久性统计信息。阈值是表中的行的10%。此设置适用于启用innodb_stats_persistent选项时创建的表。
自动统计信息重新计算也可以通过在CREATE TABLE或ALTER TABLE语句中指定STATS_PERSISTENT = 1进行配置。
innodb_stats_persistent_sample_pages
默认20,估计索引列的基数和其他统计信息(例如ANALYZE TABLE计算的数据)时要抽样的索引页数。
增加该值可以提高索引统计的准确性,这可以改进查询执行计划,但会增加InnoDB表执行ANALYZE TABLE期间的IO。
当innodb_stats_persistent禁用的情况下,以下参数才有效
innodb_stats_on_metadata
innodb_stats_transient_sample_pages
innodb_stats_on_metadata
当启用innodb_stats_on_metadata时,InnoDB会在SHOW TABLE STATUS等元数据语句或访问INFORMATION_SCHEMA.TABLES或INFORMATION_SCHEMA.STATISTICS表时更新非持久统计信息。
禁用时,InnoDB在这些操作期间不会更新统计信息。
保持禁用设置可以提高具有大量表或索引的模式的访问速度。它还可以提高涉及InnoDB表的查询的执行计划的稳定性。
innodb_stats_transient_sample_pages
默认8,估计索引列的基数和其他统计信息(例如ANALYZE TABLE计算的数据)时要抽样的索引页数。缺省值为8.
增加该值可以提高索引统计的准确性,这可以提高查询执行计划的效率,同时打开InnoDB表或重新计算统计信息时会增加IO。
innodb_stats_persistent禁用时,以下操作会导致重新收集统计信息
1 运行analyze table
2 innodb_stats_on_metadata为on时,运行SHOW TABLE STATUS, SHOW INDEX或者查询INFORMATION_SCHEMA.TABLES和INFORMATION_SCHEMA.STATISTICS
3 客户端启用--auto-rehash(默认启用)时,auto rehash也就是linux命令中的Tab键功能,会打开所有innodb表,而打开表的操作会导致统计信息重新收集
4 表第一次被打开时
5 上次更新以后,innodb内部检查到1/16的数据发生变化
转载地址:http://icbgb.baihongyu.com/