最近在的项目中需要进行数据统计,在实现时多次使用到COUNT()函数,涉及的表也包含百万级别的记录,于是借此机会对COUNT()进行了一些研究。

COUNT()函数用来统计表中行的数目或符合特定条件的行的数目。

COUNT() 函数的两种用法:

  1. COUNT(*)  — 统计表中的行的数目或符合特定条件的行的数目;
  2. COUNT(expr) — 统计表中expr字段值不为NULL的行的数目或值不为NULL且符合特定条件的行的数目(即统计时忽略expr字段值为NULL的行)。

以上表明COUNT(*)COUNT(expr)并不等价。

  1. 当统计的字段值不能为NULL(expr … NOT NULL)时,二者的结果一致;
  2. 当统计的字段值允许为NULL的时候,COUNT(expr)将会遍历所有的记录,找到不为NULL的字段。

对于MyISAM引擎,MySQL会在information_schema.TABLES中存储表的记录行数,因此在使用COUNT(*)统计表的行数的时候,直接返回该值;在统计值可以为NULL的字段的时候,使用COUNT(expr)需要进行遍历,遍历带来的结果将是性能的降低。

以上表明,在进行数据统计的时候,尽可能使用COUNT(*)来获得最佳性能。

参考链接:

  1. MySQL SELECT COUNT(*)

PS:个人感觉对比结果不是很完善,有时间再实践并补充。

Gonna Sailing 😉 ==END==