MySQL COUNT(*) 和COUNT(1)的区别

先说结论:推荐使用COUNT(*)

 

通过MySQL5.7官方文档https://dev.mysql.com/doc/refman/5.7/en/aggregate-functions.html可知

InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.

For MyISAM tables, COUNT(*) is optimized to return very quickly if the SELECT retrieves from one table, no other columns are retrieved, and there is no WHERE clause. For example:

mysql> SELECT COUNT(*) FROM student;
This optimization only applies to MyISAM tables, because an exact row count is stored for this storage engine and can be accessed very quickly. COUNT(1) is only subject to the same optimization if the first column is defined as NOT NULL.

InnoDB引擎下COUNT(*) 和COUNT(1)没有性能差异。

MyISAM引擎下使用COUNT(1)时如果第一列定义为NOT

在SQL中,`COUNT(*)` `COUNT(1)` 是两种常见的用法,它们在大多数数据库系统中(如Oracle、MySQL、SQL Server)的行为是相同的,但理解它们的设计意图潜在区别对于深入掌握SQL查询是有帮助的。 ### `COUNT(*)` 的含义 `COUNT(*)` 用于计算查询返回的所有行数,包括所有列中的 `NULL` 值重复行。它不关心某列是否有值,只要该行存在,就会被计入总数。例如: ```sql SELECT COUNT(*) "Total" FROM employees; ``` 这条语句将返回 `employees` 表中的总记录数,无论任何列是否有值[^2]。 ### `COUNT(1)` 的含义 `COUNT(1)` 实际上与 `COUNT(*)` 是等效的。这里的 `1` 是一个常量表达式,表示每一行都会被计数,而不论表中实际列的内容如何。数据库优化器通常会将 `COUNT(1)` 转换为 `COUNT(*)` 来执行。例如: ```sql SELECT COUNT(1) "Total" FROM employees; ``` 这条语句同样返回 `employees` 表中的总记录数[^1]。 ### `COUNT(*)` 与 `COUNT(1)` 的区别 尽管两者在功能上是相同的,但在语义可读性方面存在细微差异: - **语义清晰性**:`COUNT(*)` 更加直观,明确表示“统计所有行”,而 `COUNT(1)` 则可能让初学者困惑,不知道 `1` 的意义。 - **性能差异**:在大多数现代数据库系统中,`COUNT(*)` `COUNT(1)` 的执行计划是相同的,因此性能上没有显著差异。然而,某些旧版本的数据库可能会对两者有不同的处理方式,但这在当前主流系统中已不常见[^1]。 ### 使用场景建议 - 如果你的目标是统计表中的总行数,推荐使用 `COUNT(*)`,因为它更具可读性语义清晰性。 - 如果出于某种原因需要使用常量表达式(如在某些复杂查询中作为子查询的一部分),可以使用 `COUNT(1)`,但这种情况较为少见。 ### 示例代码 以下是一个简单的对比示例: ```sql -- 使用 COUNT(*) SELECT COUNT(*) AS total_rows FROM employees; -- 使用 COUNT(1) SELECT COUNT(1) AS total_rows FROM employees; ``` 两个查询将返回相同的结果。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值