本文主要是介绍MySQL如何统计表格的总行数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
使用count来统计表格的行数
按照效率排序如下:count(字段)<count(主键 id)<count(1)≈count(*)
原因如下:
- count(字段):遍历每一行 + 读取字段值 + 判断为null + 判断为not null
a) 如果这个“字段”是定义为 not null 的话,需要从每一行中读取这个字段,但不需要判断是否为null,直接累计行数加一。
b) 如果这个“字段”定义允许为 null,那么执行的时候,需要先从每行中取出该字段,然后判断是否为null,不为null那么累计行数加一。 - count(主键 id): 遍历每一行 + 读取字段 + 判断为not null
遍历全表取出每一行的id,然后判断,此处因为主键必定不为null,所以相比于count(字段)少了一个判断统计可以为null的环节,速度有所提升。 - count(1):遍历每一行 + 放入参数1
遍历全表但不取每一行的字段,而是在遍历到的每一行中放入一个参数1,那么就默认不为null,也就少了一个取每一行字段值的过程,加了一个放参数1的环节,总体速度比count(1)又要快一些。 - count(*):遍历每一行
只是遍历每一行,不取值,不判断是否为null,直接累加行数。
所以一般推荐使用count(*)来统计总行数,但是当表数据量大是使用该命令行统计速度会很慢(InnoDB相比MyISM速度要慢,但是支持事务结果准确,使用show table status命令行得到的结果速度快但十分不准确)
使用副表的高效统计方法
当表格数据量大时如何不用count函数更快的得到统计结果:
- 不能使用redis缓存实时存储表格总行数的变化,因为这是两个不同的存储构成的系统,不支持分布式事务,无法拿到精确一致的视图。(所以并发时就会导致统计结果与实际不一致);
- 所以为了得到一致性视图,需要统一在MySQL存储中存放实时的统计数据:方法就是新建一张表实时统计另一张表的总行数,并且两张表都开启事务,那么由于事务的隔离性,由统计表得到的主表记录行数总是最新对外可见的。
参考文章:
https://time.geekbang.org/column/article/72775
这篇关于MySQL如何统计表格的总行数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!