聊聊Navicat统计的行数竟然和表实际行数不一致的问题

 更新时间:2021年12月03日 08:54:14   作者:Coder小明  
Navicat作为数据库管理工具,在业界广受欢迎,这篇文章主要介绍了Navicat统计的行数竟然和表实际行数不一致的问题,需要的朋友可以参考下

背景

近期为了保障线上数据库的稳定性,我决定针对一些大表的历史数据有计划地进行备份迁移,但是呢,发现一个奇特的现象,Navicat统计行数和表自身count统计数竟然不一致!?0.0

Navicat

Navicat作为数据库管理工具,在业界广受欢迎,先甭管你电脑上现在正在运行的Navicat是正版还是盗版(你不说我也知道),不可否认的是,在我从事17年从事后端开发以来,尝试了很多同类工具,Navicat在功能上完全碾压其他数据库管理工具,尤其是细节方面,在这里不一一列举了,总之一个字,就是很好用(不接受反驳,除非你说出来一个让我心服口服的工具)。

整个经过

这次大表迁移备份,我的整体思路是:首先用Navicat对库内所有的表按照行数降序排序,然后选取Top10进行迁移备份。但是一如既往细心的我发现,它界面的统计行数竟然和我自己count这张表行数不一致?!难道要颠覆我对Navicat的认可嘛。

select count(1) from big_table_name;

为什么呢?

这让我很是诧异,一度以为自己出现了幻觉,再三确认自己没有带VR眼镜后,我踏上了寻找答案的征程。我开始思考,Mysql作为一个数据库,自身肯定就有各个表的统计,而Navicat只是作为一个可视化界面,让数据肉眼可见。

Navicat:这锅我可不背。

为了证实我的猜想,我查阅了官方文档及其他相关资料,果然,MySQL 在 information_schema.TABLES表中息存放了所有表的信息。

select * from information_schema.TABLES;

查看了这张表以后,发现表里统计记录TABLE_ROWS字段的确实与事实count不符……

这又是为什么呢?

我又陷入了沉思,带着疑惑,继续翻阅着文档,突然,看到MySQL官方文档对TABLE_ROWS的解释:

The number of rows. Some storage engines, such as MyISAM, store the exact count. For other storage engines, such as InnoDB, this value is an approximation, and may vary from the actual value by as much as 40% to 50%. In such cases, use SELECT COUNT(*) to obtain an accurate count.

看了这段话我顿悟啦,你是不是也明白怎么回事啦。什么?你没看太明白?好吧,没关系,你可能需要通过翻译软件的直译+理解,才懂得其中真正的含义。原来,TABLE_ROWS这个字段不同存储引擎的计数规则不一致,比如MyISAM引擎这表存储TABLE_ROWS存储的就是精确的行数,而对于其他的存储引擎,比如 InnoDB,这个值只是一个近似值,与实际值相差40%-50%左右。所以,在这种情况下,我们想要得到一个准确的计数,只能使用 SELECT COUNT(*) 来获得。

那又如何修正呢?

虽然疑惑得到了解答。但,和我一样有强迫症的朋友肯定会问,如何修正这个值呢?真是知道越多,未知越多,网上说可以通过

Analyze table big_table_name

得以更正这个数据,但是我动手执行之后发现,并不能更正数据,且该操作不仅耗时还会锁表,并不推荐使用……说到这,我的强迫症竟然不治自愈了。

到此这篇关于Navicat统计的行数竟然和表实际行数不一致的文章就介绍到这了,更多相关Navicat行数不一致内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SQL中NTEXT字段内容显示<long text>的原因

    SQL中NTEXT字段内容显示<long text>的原因

    SQL中NTEXT字段内容显示<long text>的原因...
    2007-03-03
  • Sybase 复制与热切换数据

    Sybase 复制与热切换数据

    SYBASE复制服务器(Sybase Replication Server)用来满足日益发展的企业客户/服务器计算机环境的需要。自从复制服务器被广泛应用以来,已成为企业范围内客户/服务器应用模式的基础。
    2009-06-06
  • Navicat12.1系列破解激活教程亲测有效

    Navicat12.1系列破解激活教程亲测有效

    这篇文章主要介绍了 Navicat12.1系列破解激活教程亲测有效,本文给大家介绍的非常详细,对大家的学习或工作工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 详解关于Dbeaver的常用操作

    详解关于Dbeaver的常用操作

    这篇文章主要介绍了详解关于Dbeaver的常用操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • sqlserver和oracle中对datetime进行条件查询的一点区别小结

    sqlserver和oracle中对datetime进行条件查询的一点区别小结

    系统中涉及公文列表的部分,需要支持对时间列的搜索功能,但必须要同时支持sqlserver和oracle两种数据库,而这在这两种数据库中编写查询语句的时候有一些不大一样的地方,无法实现一条语句实现两个数据库的正常查询,所以需要做一些调整。
    2009-06-06
  • 数据库运维人员DBA工作总结

    数据库运维人员DBA工作总结

    中大型公司都会有一些专攻数据库方面的牛人,专门的职位叫做DBA,对于公司的DBA他们的价值不可小觑,只要是数据库,就有吞吐量的限制,数据库访问瓶颈便是自然流量增长或者流量突增造成的
    2023-10-10
  • 虚拟主机ACCESS转换成MSSQL完全攻略(图文教程)

    虚拟主机ACCESS转换成MSSQL完全攻略(图文教程)

    大家都知道,ACCESS数据库在数据量到达一定程度后,访问速度会明显变慢,甚至造成崩溃。目前,大多数虚拟主机服务商提供的ASP主机空间一般都同时支持MS ACCESS和MS SQL两种类型的数据库。
    2010-04-04
  • 数据库设计经验谈

    数据库设计经验谈

    这篇文章主要介绍了数据库设计经验谈的相关资料,需要的朋友可以参考下
    2007-03-03
  • 远程数据库的表超过20个索引的影响详细解析

    远程数据库的表超过20个索引的影响详细解析

    这篇文章主要介绍了远程数据库的表超过20个索引的影响详细解析,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • 如何在Navicat新建连接、新建数据库以及导入数据库

    如何在Navicat新建连接、新建数据库以及导入数据库

    Navicat是图形化操作MySQL的强大工具,但是当数据库的服务器没有开放3306端口给办公网络时,在办公网使用navicat连接数据库是连不上的,下面这篇文章主要给大家介绍了关于如何在Navicat新建连接、新建数据库以及导入数据库的相关资料,需要的朋友可以参考下
    2023-05-05

最新评论