背景

近期为了保障线上数据库的稳定性,我决定针对一些大表的历史数据有计划地进行备份迁移,但是呢,发现一个奇特的现象,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. Win7恢复注册表

    前言 安装仿真实验环境的时候,按照指引把杀软关了,然后出现了"不是有效Win32应用程序"的错误,bd了一下解决方案,爬到了一篇文章:删除注册表中的.exe然后重启,然后,所有的e ...

  2. 提高微信小程序的应用速度

    一.是什么 小程序启动会常常遇到如下图场景: 这是因为,小程序首次启动前,微信会在小程序启动前为小程序准备好通用的运行环境,如运行中的线程和一些基础库的初始化 然后才开始进入启动状态,展示一个固定的启 ...

  3. 初学python-day11 函数3

    函数 1. global关键字 修改全局变量,声明函数内外使用同一个变量 示例: 1 name = 'xiaoming' 2 3 def test(): 4 global name 5 name = ...

  4. airtext初始化(一)

  5. .Net 5下的单文件部署

    由于.net程序没有静态链接,一直缺乏单文件部署这种干净的发布方案.对客户端程序发布并不是很友好.在之前的.net framework下,有ILMerge合并程序集,以及LibZ的嵌入资源文件等第三方 ...

  6. [no code][scrum meeting] Beta 10

    $( "#cnblogs_post_body" ).catalog() 例会时间:5月25日15:00,主持者:伦泽标 下次例会时间:5月26日11:30,主持者: 一.工作汇报 ...

  7. elasticsearch使用ik中文分词器

    elasticsearch使用ik中文分词器 一.背景 二.安装 ik 分词器 1.从 github 上找到和本次 es 版本匹配上的 分词器 2.使用 es 自带的插件管理 elasticsearc ...

  8. 浅谈如何爆踩TLEcoders

    对付一些速度比老奶奶都慢的评测姬, 除了超级小的常数,往往还不得不使用一些不算办法的办法 比如说这个让人无语的$ACcoders$的评测姬, 当我们感到代码已经无法再卡常的时候,对人生已经近乎绝望的时 ...

  9. HZOI帝国2019欢乐时刻

    前言: update 只是恢复一下原来手残删掉的博客,不是在水,嘤嘤嘤 update 以后改成Stack,但是之前的就懒得改了... by 10.31 为了窝的访问量大家的好心情,模仿学长搞了一个这个 ...

  10. Python matplotlib 概率论与数理统计 伯努利分布 二项分布

    Python 代码实现 二项分布 import numpy as np import matplotlib.pyplot as plt import math from scipy import st ...