事件起因
是这样的,今天在与三方系统进行对接,查看mysql数据库时,我这边的有一个表的数据量应该是和三方系统里的数据量是一样的,但是我给他提供的数量我当时是看的navicat提供的统计数量,如下图:
在线上的数据库里,数据差距更大,实际有12000多条,而这个工具统计到的数量只有11000多条,更是差距有上千条,差距更大了,说明这个统计肯定是有问题的。
环境和工具
mysql 5.7
navicat premium 12
原因解释
上面右边提示的行的数量其实并不是navicat工具生成的,要弄清楚一个东西,navicat只是一个可视化工具,数据都是来自于mysql数据库,mysql自己作为一个数据库,它自己有统计数量,下面的语句可以查询mysql对当前数据库所有表的一些信息统计(这个是mysql数据库本身的功能):
select * from information_schema.TABLES;
找到查询出来的之前数据显示不对的表的table_rows这列,这个数量就是navicat上面显示的数量:
行的数量。一些存储引擎,比如 MyISAM,存储的是精确的计数。对于其他的存储引擎,比如 InnoDB,这个值是一个近似值,可能与实际值相差 40%-50%。 在这种情况下,使用 SELECT COUNT(*) 来获得一个准确的计数。
关于数据库引擎:
查看当前数据库所支持的存储引擎命令:
show engines
我的mysql的查询结果:
Engine列表示引擎的名称,Support列表示是否支持这种引擎模式(列值DEFAULT表示默认的模式,YES表示支持这种模式,NO表示不支持),Transactions列表示是否支持事务(YES支持,NO不支持) 上图中只有InnoDB的存储引擎支持事务(这个涉及报错时的数据回滚,很重要)
默认存储引擎查询(并不建议改,改了后重启还是会被重置,InnoDB在后端的事务控制还挺重要的):
show variables like 'default_storage_engine%'
我的查询结果:
临时修改默认存储引擎的方法:
set default_storage_engine = < 存储引擎名 >
其实使用mysql的话,一般都是使用InnoDB作为存储引擎的,毕竟它的事务非常重要,在众多事件上都能运用得上,特别是涉及后端对数据库进行操作时的报错等问题时进行的事务回滚,保证数据的一致性 显得尤为重要
参考内容
数量不准的原因解释:https://blog.csdn.net/CSDN_WYL2016/article/details/122766885
另一篇:https://blog.csdn.net/x851288986/article/details/121677610
结束语
若是对你有所帮助的话,希望能获得你的 点赞、评论、收藏,这将是对我很大的鼓励!!! 这对我真的很重要!!!
蟹蟹٩(‘ω’)و