Yihui’s Blog

MySQL 中 count()、count(1) 和 count(字段名) 有什么区别?

日期:2026-07-11
难度:简单
标签:#面试 #MySQL #聚合函数

一句话答案

COUNT(*) 与 COUNT(1) 都统计行数且在 InnoDB 中通常性能等价;COUNT(列) 只统计该列非 NULL 的行,所以语义不同。

面试口语版

统计表总行数应写 COUNT(*),语义最清晰。COUNT(1) 的常量表达式不会是 NULL,因此也会对每行计数,现代 MySQL 优化器通常与 COUNT(*) 没有本质性能差异。COUNT(column) 会跳过 NULL,用来统计某个字段已填值的记录数;即使该列有索引也不能因为“字段名”就认定更快。InnoDB 为保证事务一致性,不能像 MyISAM 那样维护一个可直接返回的精确总行数,带条件的 count 本质仍需要扫描匹配索引或记录。

关键细节

  • COUNT(DISTINCT col) 统计非 NULL 的去重值,语义又不同。
  • 优化器可能选择最小的可用二级索引扫描,但由成本决定。
  • 大表实时精确 count 要评估成本;列表分页可考虑延迟统计、缓存或近似值。

面试官追问

  1. COUNT(*) 会统计 NULL 行吗?
  2. 为什么 InnoDB 不直接保存总行数?
  3. 如何优化大表分页总数?

学习清单

  • 牢记 COUNT(列) 的 NULL 语义。
维护与整理 · Yihui在 GitHub 上编辑

继续阅读

浏览全部文章

SQL与NoSQL有什么区别?MySQL和MongoDB如何选型?实际项目中如何选择?

日期:2026-09-27 标签:#面试 #MySQL #数据库 难度:简单 来源:牛面 MySQL 题库 答案说明:独立整理(站内题目标记为 VIP,未读取会员答案) 一句话答案 MySQL与MongoDB的主要差异在数据模型、事务边界、查询方式和模式演化;按业务访问模式和一致性需求选型。 面试口语版(约 60…

阅读全文