「日志」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

得以更正这个数据,但是我动手执行之后发现,并不能更正数据,且该操作不仅耗时还会锁表,并不推荐使用……说到这,我的强迫症竟然不治自愈了。
朋友,你有更好的办法嘛?欢迎留言。
请关注微信公众号:程序员小明!!!
程序员小明

<think>好的,用户想了解如何在Navicat更新数据库或者同步数据库的方法。我需要先回忆一下Navicat的基本操作,以及常见的数据库更新同步功能。首先,Navicat是一个数据库管理工具,支持多种数据库系统,比如MySQL、PostgreSQL、SQL Server等。用户提到的“更新数据库”可能指执行数更新操作,或者是同步数据库结构或数据到另一个环境。而“同步数据库”可能指的是同数据库之间的结构或数据同步。 接下来,我需要分步骤整理可能的操作流程。首先,用户可能需要连接到数据库,然后执行SQL语句来更新数据。或者使用Navicat提供的图形界面工具进行数据编辑。对于同步功能,Navicat有数据同步结构同步的工具,可能需要比较源数据库目标数据库,然后进行差异处理。 然后,我需要检查是否有相关的引用内容可以支持回答。用户提供的引用中有提到备份PostgreSQL数据库使用schema分开管理,这可能与数据库管理相关,但直接关于Navicat的步骤可能没有。过,引用中提到的备份同步情况可能间接相关,比如在同步数据库时可能需要先备份,或者查看同步状态。 另外,用户的问题可能涉及两种操作:一种是执行UPDATE语句来更新数据,另一种是使用Navicat的同步功能来同步两个数据库的结构或数据。需要明确这两种情况,并分别给出步骤。 首先,对于通过SQL语句更新数据,步骤可能包括连接到数据库,打开查询窗口,编写UPDATE语句并执行。这部分需要详细说明如何打开查询工具,编写正确的SQL语法,以及执行后的确认步骤。 其次,数据同步功能,Navicat提供了数据同步工具,允许用户选择源目标数据库,比较数据差异,然后选择需要同步的内容。需要指导用户如何找到这个工具,配置源目标,以及执行同步。 结构同步则可能涉及、视图等对象的同步,同样需要比较结构差异,并应用变更。这里需要注意提醒用户在同步前备份数据,避免意外数据丢失。 另外,用户可能关心同步过程中出现冲突如何处理,或者如何设置同步的方向(比如覆盖目标还是保留某些数据)。这些细节可能需要简要提及,或者建议用户查阅更详细的文档。 还需要考虑同数据库类型之间的同步是否可行,比如MySQL到PostgreSQL,但通常Navicat的结构同步可能更适合同种数据库之间。过用户的问题可能更多是在同一类型数据库的同实例之间同步。 最后,需要确保回答符合用户的要求:结构清晰,步骤详细,引用相关的内容。同时,根据系统级指令,使用正确的中文LaTeX格式,生成相关问题。 可能的相关问题包括如何备份数据库,如何执行事务处理,如何解决同步冲突等。这些需要根据回答内容生成,确保问题与主题相关,帮助用户进一步探索。</think>### Navicat更新数据库的方法与步骤 #### 一、通过SQL语句更新数据 1. **连接数据库** 打开Navicat,选择目标数据库连接,输入主机名、端口、用户名密码完成连接[^2]。 2. **打开查询窗口** 右键点击数据库 -> 选择“新建查询”,进入SQL编辑界面。 3. **编写UPDATE语句** 使用标准SQL语法更新数据,例如: ```sql UPDATE 名 SET 字段1=新值 WHERE 条件; ``` 例如:`UPDATE users SET name='John' WHERE id=1;` 4. **执行与验证** 点击“运行”按钮(▶️),观察执行结果提示“影响行数”。通过右键点击 -> “打开”验证数据是否更新成功。 --- #### 二、使用数据同步工具(跨数据库同步) 1. **进入同步向导** 顶部菜单选择“工具” -> “数据同步” -> 选择源数据库目标数据库。 2. **配置同步选项** - **映射**:勾选需要同步的 - **冲突处理**:选择“覆盖目标记录”或“保留目标记录” - 支持设置过滤条件:`WHERE create_time > '2023-01-01'` 3. **预览与执行** 点击“比对”查看差异,确认后点击“同步”启动任务。完成后查看日志确认状态[^3]。 --- #### 三、结构同步(/视图/索引等) 1. **启动结构同步** “工具” -> “结构同步” -> 选择源库与目标库。 2. **比较差异** 系统会列出结构差异(如新增字段、索引变更等),勾选需要同步的项。 3. **生成脚本并执行** 点击“运行查询”自动生成ALTER语句,支持手动修改脚本,确认后执行。 --- #### 四、事务与备份建议 - **事务控制**:在执行批量更新时,建议添加`BEGIN;``COMMIT;`保障原子性。 - **备份优先**:同步前可通过Navicat“转储SQL文件”功能备份数据库。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值