活久见,为什么SHOW TABLE STATUS总是不更新2

简介: 活久见,为什么SHOW TABLE STATUS总是不更新


那我们再看看文档中关于 IFS.TABLES 的描述吧:


25.36 The INFORMATION_SCHEMA TABLES Table

The TABLES table provides information about tables in databases.

Columns in TABLES that represent table statistics hold cached values. The information_schema_stats_expiry system variable defines the period of time before cached table statistics expire. The default is 86400 seconds (24 hours). If there are no cached statistics or statistics have expired, statistics are retrieved from storage engines when querying table statistics columns. To update cached values at any time for a given table, use ANALYZE TABLE. To always retrieve the latest statistics directly from storage engines, set information_schema_stats_expiry to 0. For more information, see Section 8.2.3, “Optimizing INFORMATION_SCHEMA Queries”.


看到这里,真相基本上呼之欲出了。

IFS.TABLES表中看到的数据是有cache的,默认cache时长是 86400秒(即1天),修改参数 information_schema_stats_expiry 即可调整时长。也就是说,除非cache过期了,或者手动执行 ANALYZE TABLE 更新统计信息,否则不会主动更新。

这个参数(功能)是MySQL 8.0后新增的,所以这个问题在8.0之前的版本不存在。

参数 information_schema_stats_expiry 还影响其 IFS.STATISTICS 表。

此外,该参数还可以在session级动态修改。

我们尝试修改session级配置:



[root@yejr.run]>set session information_schema_stats_expiry = 0;


# 修改完后就可以看到Rows数据变了
[root@yejr.run]>show table status like 'ttxx'\G
1. row **
Name: ttxx
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 795064
Avg_row_length: 57
...

[root@yejr.run]>set session information_schema_stats_expiry = 86400;
# 把session配置改回默认值,尴尬的发现Rows值又恢复成0了
[root@yejr.run] [test]>show table status like 'ttxx'\G
1. row **
Name: ttxx
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 0
...

看来,如果应用程序中有需要读取 table status 概要信息的时候,最好还是先手动执行 ANALYZE TABLE 或者修改参数值,也可以用下面这样的SQL:

select / set_var(information_schema_stats_expiry = 1) / * from information_schema.tables where table_schema='test' and table_name = 'ttxx'\G

这是MySQL 8.0后新增的HINT语法。

另外,文档中还有一段注释:

If the innodb_read_only system variable is enabled, ANALYZE TABLE may fail because it cannot update statistics tables in the data dictionary, which use InnoDB. For ANALYZE TABLE operations that update the key distribution, failure may occur even if the operation updates the table itself (for example, if it is a MyISAM table). To obtain the updated distribution statistics, set information_schema_stats_expiry=0.

意思是,当启用参数 innodb_read_only 后再执行 ANALYZE TABLE 就会失败,哪怕要更新统计信息的表是MyISAM引擎,因为所有InnoDB表都被设置为只读,更新统计信息后无法回写到对应的InnoDB字典表里了。

3. 总结

遇到诡异问题时,总是习惯性地先去查阅官方手册,通常都是可以得到答案的,耐心点,再耐心点。

            </div>
相关文章
|
新零售 数据采集 分布式计算
6000字干货分享:数据中台项目管理实践分享
本文总结了企业级数据中台项目的实践经验,希望能够为正在规划或者已在实施数据中台类项目的企业和个人提供经验。
6000字干货分享:数据中台项目管理实践分享
|
数据安全/隐私保护 Windows
Windows使用远程桌面连接树莓派
Windows使用远程桌面连接树莓派
1382 0
Windows使用远程桌面连接树莓派
|
XML NoSQL 前端开发
如何当个优秀的文档工程师?从 TC China 看技术文档工程师的自我修养
既然技术文档工程师传播的是技术内容,那么技术内容是如何进行传播呢?一名优秀的文档工程师又如何借助这种规律,让内容传播的更远,在其中他又可以借助什么工具来提升效率呢?
774 0
|
存储 运维 Kubernetes
【k8s的持久化存储】PV、PVC、StorageClass讲解(一)
【k8s的持久化存储】PV、PVC、StorageClass讲解
【k8s的持久化存储】PV、PVC、StorageClass讲解(一)
|
机器学习/深度学习
如何修复老照片,Bringing-Old-Photos-Back-to-Life机器学习开源项目安装使用 | 机器学习(2)
如何修复老照片,Bringing-Old-Photos-Back-to-Life机器学习开源项目安装使用 | 机器学习
如何修复老照片,Bringing-Old-Photos-Back-to-Life机器学习开源项目安装使用 | 机器学习(2)
|
Cloud Native Docker 容器
云原生之使用Docker部署Minimalist-web-notepad个人笔记本
云原生之使用Docker部署Minimalist-web-notepad个人笔记本
823 0
云原生之使用Docker部署Minimalist-web-notepad个人笔记本
|
敏捷开发 弹性计算 负载均衡
EIP概要与使用操作|学习笔记
快速学习EIP概要与使用操作
EIP概要与使用操作|学习笔记
|
机器学习/深度学习 算法 数据可视化
Deep Graph Infomax:互信息最大化的无监督图对比学习
Deep Graph Infomax:互信息最大化的无监督图对比学习
1135 0
Deep Graph Infomax:互信息最大化的无监督图对比学习
|
前端开发 easyexcel 对象存储
Alibaba EasyExcel实现excel数据批量导入
最近在党建业务需求开发中,PD提出需要对党组织数据进行批量替换的需求。 对需求分析理解后,我在项目中使用了Alibaba EasyExcel进行功能研发。
3944 0
Alibaba EasyExcel实现excel数据批量导入
|
Python
关于xlrd最新版本不支持.xlsx文件的解决办法
关于xlrd最新版本不支持.xlsx文件的解决办法 解决方案,回退到xlrd1.2.0版本 这是很久之前我就遇到的一个问题,这次又遇到了,发现之前没有写笔记,这次记录一下。
1043 0

热门文章

最新文章