为什么SQL中COUNT(1)比COUNT(*)在某些情况下执行速度更快?
- 内容介绍
- 相关推荐
本文共计947个文字,预计阅读时间需要4分钟。
大多数主流数据库(如MySQL 8.0、PostgreSQL、SQL Server、Oracle)的查询优化器会将 `COUNT(1)` 和 `COUNT(*)` 视为等价操作,最终生成完全相同的执行计划。这并非诡计,而是SQL标准语义和优化器长期演化的结果:
所以如果你看到某篇老文章说“COUNT(1) 比 COUNT(*) 快”,大概率是基于以下情况之一:
- 使用了非常早期的 MySQL 版本(如 5.5 或更早),且未开启优化器增强
- 测试时恰好命中了缓存或统计信息偏差,误判了耗时
- 对比的是
COUNT(col)而非COUNT(*),混淆了 NULL 判断开销
真正影响 COUNT 性能的关键是列是否可空
COUNT(column) 的性能差异不来自“写法”,而来自语义:它必须逐行检查该列是否为 NULL。哪怕这个列上有索引,只要不是 NOT NULL 约束,优化器就无法跳过 NULL 判断。
本文共计947个文字,预计阅读时间需要4分钟。
大多数主流数据库(如MySQL 8.0、PostgreSQL、SQL Server、Oracle)的查询优化器会将 `COUNT(1)` 和 `COUNT(*)` 视为等价操作,最终生成完全相同的执行计划。这并非诡计,而是SQL标准语义和优化器长期演化的结果:
所以如果你看到某篇老文章说“COUNT(1) 比 COUNT(*) 快”,大概率是基于以下情况之一:
- 使用了非常早期的 MySQL 版本(如 5.5 或更早),且未开启优化器增强
- 测试时恰好命中了缓存或统计信息偏差,误判了耗时
- 对比的是
COUNT(col)而非COUNT(*),混淆了 NULL 判断开销
真正影响 COUNT 性能的关键是列是否可空
COUNT(column) 的性能差异不来自“写法”,而来自语义:它必须逐行检查该列是否为 NULL。哪怕这个列上有索引,只要不是 NOT NULL 约束,优化器就无法跳过 NULL 判断。

