纳尼?MySQL 中 count(1) 比 count(*) 快?
2024-02-22 09:13:55
纳尼?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) 的性能都非常快。