为什么SQL中COUNT(1)比COUNT(*)在某些情况下执行速度更快?

2026-04-27 21:451阅读0评论SEO基础
  • 内容介绍
  • 相关推荐

本文共计947个文字,预计阅读时间需要4分钟。

为什么SQL中COUNT(1)比COUNT(*)在某些情况下执行速度更快?

大多数主流数据库(如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分钟。

为什么SQL中COUNT(1)比COUNT(*)在某些情况下执行速度更快?

大多数主流数据库(如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 判断。

阅读全文