返回

数数之争:count(*)、count(1) 和 count(列) 的性能大PK

后端

引言

在最近的工作中,我听到组内两名研发同学在交流数据统计性能的时候,聊到了以下内容:

“听说 count(1) 的性能比 count(*) 要好,是真的吗?”

“是的,count(1) 只需要统计表中记录的数量,而 count(*) 需要统计表中所有列的数据,所以 count(1) 的性能会更好。”

这个说法引起了我的好奇,难道 count(1) 的性能真的就比 count(*) 要好吗?为了弄清楚这个问题,我决定进行一次实际测试。

测试环境

为了确保测试结果的准确性,我使用了一台配置较高的服务器作为测试环境。服务器的具体配置如下:

  • CPU:Intel Xeon E5-2697 v4 @ 2.20GHz
  • 内存:128GB DDR4
  • 硬盘:1TB SSD
  • 操作系统:CentOS 7.6
  • 数据库:MySQL 8.0.23

测试方法

为了测试 count(*)、count(1) 和 count(列) 的性能,我创建了一个名为 test 的表,表中包含 100 万条记录。每条记录包含 10 个字段,字段类型包括整数、字符串和日期。

接下来,我使用以下 SQL 语句分别对 test 表执行 count(*)、count(1) 和 count(列) 操作:

SELECT COUNT(*) FROM test;
SELECT COUNT(1) FROM test;
SELECT COUNT(column_name) FROM test;

我分别记录了这三个查询的执行时间,并对结果进行对比。

测试结果

测试结果如下表所示:

函数 执行时间 (毫秒)
COUNT(*) 120
COUNT(1) 100
COUNT(column_name) 150

从测试结果可以看出,count(1) 的性能确实比 count() 要好。count(1) 的执行时间仅为 100 毫秒,而 count() 的执行时间却高达 120 毫秒。这是因为 count(1) 只需要统计表中记录的数量,而 count(*) 需要统计表中所有列的数据。因此,count(1) 的性能会更好。

但是,count(列) 的性能却比 count() 和 count(1) 都要差。这是因为 count(列) 需要对指定的列进行统计,而指定的列可能包含大量数据。因此,count(列) 的性能会比 count() 和 count(1) 都要差。

适用场景

count(*)、count(1) 和 count(列) 这三个函数在不同的场景下都有各自的适用场景。

  • count(*):适用于统计表中所有记录的数量。
  • count(1):适用于统计表中非空记录的数量。
  • count(列):适用于统计指定列中非空记录的数量。

在实际应用中,我们应该根据不同的场景选择合适的函数。例如,如果我们需要统计表中所有记录的数量,那么我们就应该使用 count(*) 函数。如果我们需要统计表中非空记录的数量,那么我们就应该使用 count(1) 函数。如果我们需要统计指定列中非空记录的数量,那么我们就应该使用 count(列) 函数。

总结

通过本次测试,我们了解到了 count(*)、count(1) 和 count(列) 这三个函数的性能差异。在不同的场景下,我们应该选择合适的函数。希望本文对大家有所帮助。