暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

持久化优化器统计信息/Persistent Optimizer Statistics

原创 冯刚 2020-11-05
1390

参考:MySQL5.7官方文档

介绍

持久性优化器统计信息功能,通过将统计信息存储到磁盘并使它们在服务器重新启动时保持持久性,来提高计划的稳定性,因此优化器更有可能每次为给定查询做出一致的选择。

当innodb_stats_persistent = ON或使用STATS_PERSISTENT = 1创建或更改单个表时,优化器统计信息将保留在磁盘上。 innodb_stats_persistent默认情况下处于启用状态。

以前,优化器统计信息是在每次服务器重新启动时以及在执行一些其他操作后清除的,并在下次访问表时重新计算。 因此,当重新计算统计信息,导致查询执行计划中的选择不同,从而导致查询性能发生变化。

永久统计信息存储在mysql.innodb_table_stats和mysql.innodb_index_stats表,

mysql> desc mysql.innodb_table_stats;

image.png

mysql> desc mysql.innodb_index_stats;

image.png

mysql> select * from mysql.innodb_table_stats where database_name=‘sakila’ and table_name=‘actor’;

image.png

mysql> select * from mysql.innodb_index_stats where database_name=‘sakila’ and table_name=‘actor’;
image.png

innodb_table_stats和innodb_index_stats表是普通表,可以手动更新。

手动更新统计信息的功能使得可以在不修改数据库的情况下强制执行特定的查询优化计划或测试替代计划。

如果您手动更新统计信息,请发出FLUSH TABLE tbl_name命令使MySQL重新加载更新的统计信息。

持久统计信息被视为本地信息,因为它们与服务器实例有关。

因此,在进行自动统计信息重新计算时,不会复制innodb_table_stats和innodb_index_stats表。 如果运行ANALYZE TABLE以启动统计信息的同步重新计算,则会复制该语句(除非您禁止对其进行日志记录),并且将在复制从属服务器上进行重新计算。

innodb_table_stats

innodb_table_stats里面每张表包含一条数据。

示例表:t1,包含primary index (columns a, b) ,secondary index (columns c, d), and unique index (columns e, f):

CREATE TABLE t1 (
a INT, b INT, c INT, d INT, e INT, f INT,
PRIMARY KEY (a, b), KEY i1 (c, d), UNIQUE KEY i2uniq (e, f)
) ENGINE=INNODB;

插入五条数据:
mysql> insert into t1 values(1,1,10,11,100,101),(1,2,10,11,200,102),(1,3,10,11,100,103),(1,4,10,12,200,104),(1,5,10,12,100,105);

mysql> select * from t1;
image.png

运行ANALYZE TABLE收集统计信息(如果启用了innodb_stats_auto_recalc,则假设达到已更改表行的10%阈值,统计信息将在几秒钟内自动更新)

mysql> ANALYZE TABLE t1;
mysql> select * from mysql.innodb_table_stats where database_name=‘d1’ and table_name=‘t1’;
image.png

表t1的统计信息显示InnoDB更新表t1统计信息的最后时间是2020-11-05 11:50:45,表有5行数据,聚集索引大小1个页,其它索引的大小2个页。

innodb_index_stats

innodb_index_stats里面每个索引包含多条数据。表中的每一行提供与特定索引统计相关的数据,该统计在stat_name列中命名并在stat_description列中描述。

mysql> select * from mysql.innodb_index_stats where database_name=‘d1’ and table_name=‘t1’;

image.png

stat_name列展示以下几种类型的统计信息:

size:其中stat_name = size,stat_value列显示索引中的总页数。

n_leaf_pages:其中stat_name = n_leaf_pages,stat_value列显示索引中的叶子页数。

n_diff_pfxNN:其中stat_name = n_diff_pfx01,stat_value列显示索引第一列中不同值的数量。stat_name = n_diff_pfx02,stat_value列显示索引的前两列中不同值的数量,。。。以此类推。此外,在stat_name = n_diff_pfxNN的情况下,stat_description列显示以逗号分隔的索引列的列表。

mysql> select * from mysql.innodb_index_stats where database_name=‘d1’ and table_name=‘t1’ and stat_name like ‘n_diff%’;

image.png

对于聚集索引,n_diff%行的数量等于索引中列的数量;对于非唯一索引,n_diff%行的数量还要追加上聚集索引的列。

未完。。。。。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论