都2020年了,你还不知道count(1)和count(*)谁效率更高吗?

今天公司的一个需求需要统计一个数据库中表的行数有多少,二话不说当然就直接用count()这个聚合函数,以前经常听到一种说法说count(1)的效率比count(*)要高,于是测试了一下count(1)和count(*)的速度差距,发现两者的查询速度很接近,甚至count(*)要更快一些,于是就有了这篇文章。

1.count()的用法

count()聚合函数应该是我们学习数据库时最早学到的函数,主要用于查询表中数据的数量,常用的查询语句有count(*),count(字段),count(1),count(主键)。

2.count(主键)

对于count(主键)来说,会遍历所有主键取出所有的值并按行累加,因为主键不会为空,最终会返回总的行数。

3.count(字段)

对于count(字段)来说,会遍历所有该字段,如果为null则跳过,否则取出并累加,最后返回的是非null的总和。

4.count(1)

对于count(1)来说,会遍历整张表,但不取值,直接计算行数。因此count(1)的性能要高于count(主键)。和count(主键)相比,count(1)少了一个取值的动作,减少的这个取值的动作使得count(1)的效率高于count(主键)。

5.count(*)

对于count(*)来说,count(*)的用法在早期的数据库和现在的数据库中有较大的差距,在早期的数据库中,count(*)有可能会导致全表的扫描,因此效率会低。如今的数据库引擎对count(*)做了优化,比如MyIsam引擎中count(*)会直接读取一个总行数的值,因此速度是最快的,InnoDB也同样对count(*)做了优化,用类似count(1)的方式获取行数,因此count(*)效率接近count(1)。

6.总结

总的来讲,在如今的系统中,你大可放心的使用count(*),他的效率是最高的,如果你要兼容10年前的系统,那就使用count(1)。

我建了一个公众号【鱼仔ly】,每日更新java基础、源码、项目,我们一起冲大厂!

猜你喜欢

转载自blog.csdn.net/qq_33762302/article/details/114682549