纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

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

Coder小明   2021-12-02 我要评论
想了解聊聊Navicat统计的行数竟然和表实际行数不一致的问题的相关内容吗Coder小明在本文为您仔细讲解Navicat行数不一致的相关知识和一些Code实例欢迎阅读和指正我们先划重点: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

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


相关文章

猜您喜欢

网友评论

Copyright 2020 www.ducttapegames.com 【环球游戏网】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式