在mysql 5.6中,innodb_stats_on_metadata默认是关闭了这个会对INFORMATION_SCHEMA中的一些表进行查询操作,以方便索引统计信息,如果读要求高的建议关闭,见淘宝丁奇的http://t.cn/zWG9ikt一文;不过疑问是,mysql看上去用analyze命令去做oracle类似的直方图统计功能?
下面看下这个参数。首先,mysql innodb是在什么时候去做表的索引数据更新统计分析呢?
答案是:
1.Metadata commands like SHOW INDEX, SHOW TABLE STATUS and SHOW [FULL] TABLES (or their corresponding queries from INFORMATION_SCHEMA.TABLES and INFORMATION_SCHEMA.STATISTICS)
2.When 1 / 16th of the table or 2Billion rows has been modified, whichever comes first. ./row/row0mysql.c:row_update_statistics_if_needed
也就是说,当使用 SHOW INDEX, SHOW TABLE STATUS and SHOW [FULL] TABLES时,会自动更新统计信息,或者对应的从 INFORMATION_SCHEMA.TABLES和INFORMATION_SCHEMA.STATISTICS 表中查询时。
2 当2 百万条记录中的1/16记录变更后
要注意的是,如果生产环境上,大表大数据上,要谨慎做这些线上的数据统计分析,
道理和oracle的是一样的。但在Percona Server 的innodb_stats_auto_update
(http://www.percona.com/doc/percona-server/5.1/diagnostics/innodb_stats.html)
则可以进行参数设置。mysql 5.1以上,也有个参数叫
innodb_stats_on_metadata可以设置,percona中同时有innodb_stats_on_metadata
和innodb_stats_auto_update,如果要同时禁止,两个参数都要设置为0;
而在 InnoDB Plugin 中,可以设置一个开关:
SET GLOBAL innodb_stats_on_metadata=on(/off),这样就可以在运行期间去
动态设置了。