MySQL如何统计表格的总行数

使用count来统计表格的行数

按照效率排序如下:count(字段)<count(主键 id)<count(1)≈count(*)

原因如下:

  1. count(字段):遍历每一行 + 读取字段值 + 判断为null + 判断为not null
    a) 如果这个“字段”是定义为 not null 的话,需要从每一行中读取这个字段,但不需要判断是否为null,直接累计行数加一。
    b) 如果这个“字段”定义允许为 null,那么执行的时候,需要先从每行中取出该字段,然后判断是否为null,不为null那么累计行数加一。
  2. count(主键 id): 遍历每一行 + 读取字段 + 判断为not null
    遍历全表取出每一行的id,然后判断,此处因为主键必定不为null,所以相比于count(字段)少了一个判断统计可以为null的环节,速度有所提升。
  3. count(1):遍历每一行 + 放入参数1
    遍历全表但不取每一行的字段,而是在遍历到的每一行中放入一个参数1,那么就默认不为null,也就少了一个取每一行字段值的过程,加了一个放参数1的环节,总体速度比count(1)又要快一些。
  4. count(*):遍历每一行
    只是遍历每一行,不取值,不判断是否为null,直接累加行数。

所以一般推荐使用count(*)来统计总行数,但是当表数据量大是使用该命令行统计速度会很慢(InnoDB相比MyISM速度要慢,但是支持事务结果准确,使用show table status命令行得到的结果速度快但十分不准确)

使用副表的高效统计方法

当表格数据量大时如何不用count函数更快的得到统计结果:

  • 不能使用redis缓存实时存储表格总行数的变化,因为这是两个不同的存储构成的系统,不支持分布式事务,无法拿到精确一致的视图。(所以并发时就会导致统计结果与实际不一致);
  • 所以为了得到一致性视图,需要统一在MySQL存储中存放实时的统计数据:方法就是新建一张表实时统计另一张表的总行数,并且两张表都开启事务,那么由于事务的隔离性,由统计表得到的主表记录行数总是最新对外可见的。

参考文章:

https://time.geekbang.org/column/article/72775

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值