背景

近期为了保障线上数据库的稳定性,我决定针对一些大表的历史数据有计划地进行备份迁移,但是呢,发现一个奇特的现象,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统计的行数竟然和表实际行数不一致的更多相关文章

  1. Linux 小知识翻译 - 「日志」(log)

    这次聊聊「日志」. 「日志」主要指系统或者软件留下的「记录」.出自表示「航海日志」的「logbook」. 经常听说「出现问题的时候,或者程序没有安装自己预期的来运行的时候,请看看日志!」. 确实,记录 ...

  2. 所有 Python 程序员必须要学会的「日志」记录。

    本文字数:3840 字 阅读本文大概需要:10 分钟 写在之前 在我们的现实生活中,「日志记录」其实是一件非常重要的事情,比如银行的转账记录,汽车的行车记录仪记录行驶过程中的一切,如果出现了什么问题, ...

  3. 「HNOI2002」营业额统计

    「HNOI2002」营业额统计 传送门 这题比较板子吧应该... 有几个需要注意的地方: 第一次插入时就要贡献答案 在每次计算贡献时,注意分裂出来的子树是否为空,并且要对两边的相邻元素之差取 \(\m ...

  4. 「CH2101」可达性统计 解题报告

    CH2101 可达性统计 描述 给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量.N,M≤30000. 输入格式 第一行两个整数N,M,接下来M行每行两个整数x,y,表示从x到 ...

  5. LOJ #2183「SDOI2015」序列统计

    有好多好玩的知识点 LOJ 题意:在集合中选$ n$个元素(可重复选)使得乘积模$ m$为$ x$,求方案数对$ 1004535809$取模 $ n<=10^9,m<=8000且是质数,集 ...

  6. MySQL数据库中统计一个库中的所有表的行数?

    今天公司两个远端的数据库主从同步有点问题,查看下wordpress库下所有表的表的条目? mysql> use information_schema;Database changedmysql& ...

  7. 【LOJ】#2183. 「SDOI2015」序列统计

    题解 这个乘积比较麻烦,转换成原根的指数乘法就相当于指数加和了,可以NTT优化 注意判掉0 代码 #include <bits/stdc++.h> #define fi first #de ...

  8. 【ShardingSphere技术专题】「ShardingJDBC」SpringBoot之整合ShardingJDBC实现分库分表(JavaConfig方式)

    前提介绍 ShardingSphere介绍 ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC.Sharding-Proxy和Shardin ...

  9. SQL SERVER 中 实现主表1行记录,子表多行记录 整合成一条虚拟列

    表中有这样的记录,简单的主子表,现要想通过left join 语句把两表关联起来 select * from tbl_diary_reback a left join tbl_diary_reback ...

随机推荐

  1. DDD领域驱动设计-案例建模设计-Ⅲ

    1. 背景 参考<DDD领域驱动设计-案例需求文档>,本文将构建实体,聚合根详述领域驱动中的建模设计.构建实体,聚合根的一些原则或方法,将在后续文章中说明. 2. 建模设计 2.1. 实体 ...

  2. 上拉电阻大小对i2c总线的影响

    漏极开路上拉电阻取值为何不能很大或很小? 如果上拉电阻值过小,Vcc灌入端口的电流(Ic)将较大,这样会导致MOS管V2(三极管)不完全导通(Ib*β<Ic),有饱和状态变成放大状态,这样端口输 ...

  3. Java并发:重入锁 ReentrantLock(二)

    一.理解锁的实现原理 1. 用wait()去实现一个lock方法,wait()要和synchronized同步关键字一起去使用的,直接使用wait方法会直接报IllegalMonitorStateEx ...

  4. Docker容器间网络互联原理,讲不明白算我输....

    @ 目录 一.今天我们要搞明白的实验 二.前置网络知识 2.1.docker默认为我们创建的网络 2.2.怎么理解docker0网桥 2.3.什么是veth-pair技术? 三.同一个局域网中不同主机 ...

  5. 【Go语言细节】反射

    什么是反射 维基百科上反射的定义: 在计算机科学中,反射是指计算机程序在运行时(Run time)可以访问.检测和修改它本身状态或行为的一种能力.用比喻来说,反射就是程序在运行的时候能够"观 ...

  6. 八. Go并发编程--errGroup

    一. 前言 了解 sync.WaitGroup的用法都知道 一个 goroutine 需要等待多个 goroutine 完成和多个 goroutine 等待一个 goroutine 干活时都可以解决问 ...

  7. Git使用教程之初级入门命令行(二)

    一.Git 操作流程图 1.git --help 查看帮助 Administrator@PC-xiaobing MINGW64 /d/Git (master) $ git --help usage: ...

  8. loadruuner12基准测试流程

    基准测试:单用户测试 一.归纳基准测试: 方法一:单用户循环5次 1.调试好脚本(加检查点,在VuGen中运行成功) 2.打开控制台,设置Run-time Settings 3.迭代次数:5 4.Pa ...

  9. 【.NET 与树莓派】用 MPD 制作数字音乐播放器

    树莓派的日常家居玩法多多,制作一台属于自己的数字音乐播放机是其中的一种.严格上说,树莓派是没有声卡的,其板载的 3.5 mm 音频孔实际是通过 PWM 来实现音频输出的(通过算法让PWM信号变成模拟信 ...

  10. MyCat读写分离+MySql主从(一主一从)

    数据库一直在项目担当着一位核心的角色,是所有项目结构中的底层,说白了,我们程序员进行项目开发都是在和数据打交道,而数据都是保存在数据库中,如mysql.oracle.postgresql等等,如果一个 ...