日期: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 要评估成本;列表分页可考虑延迟统计、缓存或近似值。
面试官追问
COUNT(*)会统计 NULL 行吗?- 为什么 InnoDB 不直接保存总行数?
- 如何优化大表分页总数?
学习清单
- 牢记
COUNT(列)的 NULL 语义。