前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL ANALYZE命令存在的BUG,你可能还不知道……

MySQL ANALYZE命令存在的BUG,你可能还不知道……

作者头像
jeanron100
发布2021-09-02 11:36:24
5930
发布2021-09-02 11:36:24
举报

作者介绍

农行研发中心“数风云”团队,一支朝气蓬勃、快速成长的技术团队,始终致力于农行大数据、数据库和云计算等领域的应用实践与技术创新,探索数据赋能,勇攀数据云巅,为企业数字化转型和金融科技发展不断贡献力量。

一、ANALYZE命令概述

ANALYZE命令主要的作用是对表进行分析操作,其主要的作用包括以下几点:

  1. 更新表的统计信息;
  2. 对表中索引的分别进行分析并保存;

针对ANALYZE命令的作用1,值得注意的是,MySQL数据库中表的统计信息是保存在INFORMATION_SCHEMA.TABLES表中,用户可以通过以下两个命令查询表的统计信息:

代码语言:javascript
复制
SHOW TABLE STATUS LIKE ‘table_name’;
代码语言:javascript
复制
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = ‘table_name’;

但是,INFORMATION_SCHEMA.TABLES表中存储的信息并不是实时的表统计信息,而是缓存统计信息,缓存时间由information_schema_stats_expiry参数控制。该参数默认值为86400秒,即一天。使用ANALYZE命令可以使MySQL强制更新INFORMATION_SCHEMA.TABLES表中存储的信息。

二、测试场景

本文采用的数据库服务器的操作系统为CentOS 8.0,MySQL数据库的版本为8.0.18。

三、ANALYZE测试

  • 步骤一:查看当前表的信息

在插入新数据之前,对测试表pdcr的真实记录行数,如下所示:

在插入新数据之前,查询测试表pdcr的统计信息,如下图所示:

  • 步骤二:插入大量数据后查看当前表的信息

在向测试表插入300万行数据(原数据量的3倍),查看测试表的真实记录行数,如下图所示:

在向测试表插入300万行数据(原数据量的3倍),查看测试表的统计信息,如下图所示。可以看到统计信息仍然没有更新,这是由于统计信息并不是实时生成的,而是使用的缓存的统计信息。

  • 步骤三:ANALYZE命令指定的表名使用大写

当使用ANALYZE命令中指定的表名使用大写情况下,返回信息显示更新表统计信息成功:

但是实际该表的统计信息并没有得到更新,如下图所示:

  • 步骤四:ANALYZE命令指定的表名使用小写

当使用ANALYZE命令中指定的表名使用小写情况下,返回信息显示更新表统计信息成功:

并且此时ANALYZE命令成功更新了表的统计信息,如下图所示:

四、测试结论

通过上面的测试,可以发现MySQL 8.0.18的ANALYZE命令存在BUG。这个BUG为当ANALYZE命令指定的表名为大写时,虽然返回的信息显示更新成功,但MySQL数据库并未更新相关的统计信息。但是当ANALYZE命令指定的表名为小写时,不存在类似的BUG,MySQL数据库可以完成更新相关的统计信息。

dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-08-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 杨建荣的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档