返回

纳尼?MySQL 中 count(1) 比 count(*) 快?

后端

纳尼?MySQL 中 count(1) 比 count(*) 快?

今天有人跟我讲 MySQL 中 count(1) 比 count(*) 快,这能忍?必须得和他掰扯掰扯。

声明:以下讨论基于 InnoDB 存储引擎,MyISAM 因为情况特殊我在文末会单独说一下。

count(*) 和 count(1) 的区别

count(*) 和 count(1) 都用于计算表中的行数。但它们之间还是有一些区别的:

  • count(*) 计算表中所有行的数量,包括 NULL 值。
  • count(1) 计算表中非 NULL 值的数量。

为什么 count(1) 有时会更快?

在某些情况下,count(1) 可能比 count(*) 更快。这是因为:

  • count(*) 需要扫描整个表,而 count(1) 只需要扫描表中非 NULL 值的行。
  • count(*) 需要对每一行进行计算,而 count(1) 只需要对非 NULL 值的行进行计算。

什么时候应该使用 count(*) 和 count(1)

一般来说,应该使用 count()。这是因为 count() 更通用,可以计算表中所有行的数量,包括 NULL 值。

但是,在某些情况下,使用 count(1) 可能更合适。例如:

  • 当表中有很多 NULL 值时。
  • 当只需要计算表中非 NULL 值的数量时。

MyISAM 中的 count(*) 和 count(1)

在 MyISAM 存储引擎中,count() 和 count(1) 的性能差异并不明显。这是因为 MyISAM 使用了不同的索引结构,使得 count() 和 count(1) 的性能都非常快。

总结

count() 和 count(1) 都用于计算表中的行数,但它们之间还是有一些区别的。count() 计算表中所有行的数量,包括 NULL 值。count(1) 计算表中非 NULL 值的数量。在某些情况下,count(1) 可能比 count() 更快。这是因为 count() 需要扫描整个表,而 count(1) 只需要扫描表中非 NULL 值的行。count() 需要对每一行进行计算,而 count(1) 只需要对非 NULL 值的行进行计算。一般来说,应该使用 count()。这是因为 count() 更通用,可以计算表中所有行的数量,包括 NULL 值。但是,在某些情况下,使用 count(1) 可能更合适。例如:当表中有很多 NULL 值时。当只需要计算表中非 NULL 值的数量时。在 MyISAM 存储引擎中,count() 和 count(1) 的性能差异并不明显。这是因为 MyISAM 使用了不同的索引结构,使得 count(*) 和 count(1) 的性能都非常快。