innodb_stats_persistent这个参数控制着统计信息是否写入到磁盘上,否则频繁计算的统计信息可能导致执行计划发生改变。 innodb_stats_persistent_sample_pages这个参数控制着采样的数量,跟Oracle动态采样参数含义相同。 统计信息存放在 MySQL.innodb_table_stats and mysql.innodb_index_stats两个表中,通过这2个表上的last_update字段,可以看到最后的统计信息收集的时间。可以使用ALTER TABLE tbl_name STATS_PERSISTENT=0这个语句来进行统计信息的非持久化。 innodb_stats_auto_recalc 这个参数控制着在表中行的数量改变超过10%的时候,是否重新收集统计信息。这个收集的动作是异步的,在执行完大的dml后,可能会过一段时间才重新收集统计信息,如果想要及时的统计信息,执行analyze命令去收集。 如果手工更新了统计信息,使用 FLUSH TABLE tbl_name 命令重新加载表及统计信息。 查看索引的大小,可以在统计信息中看 SELECT SUM(stat_value) pages, index_name, -> SUM(stat_value)*@@innodb_page_size size -> FROM mysql.innodb_index_stats WHERE table_name=’t1’ -> AND stat_name = ‘size’ GROUP BY index_name;
SELECT SUM(stat_value) pages, index_name, -> SUM(stat_value)*@@innodb_page_size size -> FROM mysql.innodb_index_stats WHERE table_name like ‘t1#P%’ -> AND stat_name = ‘size’ GROUP BY index_name;
在下面的情况下考虑修改innodb_stats_persistent_sample_pages采样数: 1统计信息不够精确,执行计划没有最优化。统计是否准确,可以通过手工统计跟mysql.innodb_index_stats 中的信息对比。 2analzye命令太慢了,可能是采样太多了 可以看到索引的数量也是跟统计信息收集快慢有关的,及主键的构成。
新闻热点
疑难解答