mysql怎么查询所有表的数据量

哎呀,让我告诉你我当时遇到的陷阱。
有一年,我在上海做一个电子商务项目。
数据库突然崩溃了,老板急得屁股上打了热烙铁。
我只是想快速知道每个表的大概数据量,所以我使用了你提到的INFORMATION_SCHEMA.TABLES。

当时我很困惑。
为什么InnoDB表中的行数与实际行数相差如此之大?查资料后发现InnoDB的值是一个估计值,MyISAM是实时更新的。
幸运的是,当时项目使用的是 MyISAM,否则我将不得不运行另一轮 COUNT(),数据库就会挂起。

有一个特别有用的场景。
去年把数据迁移到深圳的时候,我首先要评估每个表的大小。
我直接运行这个SQL脚本,发现了几个废弃的空表。
我很快就把它们删除了。
节省了多少空间。
不过在连接之前需要重新进行准确的统计,以免到时候服务器无法处理。

值得注意的是,今年在北京的另一个项目中,有朋友使用了这条SQL直接检查生产数据库。
结果information_schema也被归档了,数据库也炸了。
因此,需要使用 WHERE 子句来排除系统库。
另外,不要用它来进行精确的统计。
我尝试对表中的数千万行数据使用 COUNT(),CPU 直接烧毁。

现在我们将脚本分组为监控任务,每周运行一次并保存到监控平台。
这样您就可以看到数据趋势,而不会影响您的业务。
如果确实想要准确的统计,建议使用pt-query-digest来分析慢查询,或者写一个批处理脚本来慢速运行。
不要总是使用这个SQL来进行精确的统计。
这东西是为了快速而粗略的结果。

MySQL查询数据库表记录数

我记得有一次,我正在维护一个电子商务网站的后端数据库。
当时数据量已经很大,有上千张表。
有一天,老板突然问我:“小李,给我看看我们这个月卖了多少件东西?” 我一听,就觉得这件事情不太容易,所以我只得查看订单。
但问题来了。
订单表中记录过多。
直接 COUNT() 肯定需要一段时间。
当时我突然想到,MySQL不是有一个information_schema系统表吗? 可以用来快速查询表记录的数量,不同的存储引擎有不同的统计方法。

我查了一下,发现MyISAM引擎的统计速度是最快的,而且可以直接从table_rows字段获取准确的记录数。
于是,我立刻写了一条SQL语句:
sql SELECT table_name AS '表名', table_rows AS '记录数' 来自 information_schema.tables WHERE table_schema = '数据库名称' ORDER BY table_rows DESC;
这条SQL语句执行速度非常快,几秒钟就出来了。
我一看,订单表里的记录数确实是老板想要的数。
不过,我也知道,如果是InnoDB引擎表,这种方法不太准确,因为InnoDB不维护实时行数统计,误差可能高达4 0%到5 0%。

然后,我想到老板可能还需要知道其他表中的记录条数,比如用户表、产品表等,这些表可能使用了InnoDB引擎,所以我写了一个比较复杂的SQL语句,通过脚本批量生成COUNT()查询语句,然后执行这些语句。

虽然这个过程有点复杂,但最终还是顺利完成了老板的需求。
那次经历让我认识到数据库维护和优化真是一门学问,必须根据实际情况灵活运用各种方法。
等等,还有一件事。
我突然想到,如果表数量较多,或者表的数据量较大,直接执行COUNT()可能还是会遇到性能问题。
看来数据库优化和监控还得继续。

mysql查询语句数量查询

直接使用 COUNT() 来统计项目总数。
例如,person 表是从 person SELECT COUNT() 写入的。
将 WHERE 添加到条件查询。
例如,要测试 id=1 ,语法为 SELECT COUNT() FROM test WHERE id=1 Navicat 可以可视化表属性。
要查看多个表中的总数,可以使用子查询,例如查看学生表和教师表,公式为 SELECT s.num1 , t.num2 FROM (Select COUNT() num1 from school) s, (Select COUNT() num2 from Teacher) t。
大数据表速度慢,要注意优化。
使用 LIMIT 检查前 N 项。
例如,要测试测试表中的前 1 0 项,语法为 SELECT LIMIT 1 0 FROM test。
搜索从 M 开始的 N 个项目的公式是 SELECT 2 , 1 0 FROM TEST LIMIT。

称一下体重。