首页/数据/SQL 速查/COUNT 的精确成本与近似替代
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条函数速查60 条变更与事务52 条
性能与执行计划72 条

COUNT 的精确成本与近似替代

COUNT(*) 需要扫描符合条件的行:InnoDB 选择较小的索引扫描;海量数据考虑近似值与维护计数表。

SQL 速查数据更新于 2026-10-12

示例

示例
-- 精确计数:条件列有索引时可减少扫描量
SELECT COUNT(*) FROM orders WHERE user_id = 100;

-- MySQL 近似行数(InnoDB 估算,仅用于趋势参考)
SELECT table_rows FROM information_schema.tables
WHERE table_schema = 'shop' AND table_name = 'orders';

-- PostgreSQL 近似行数
SELECT reltuples::bigint AS estimate FROM pg_class WHERE relname = 'orders';
InnoDB 机制不维护行数缓存:COUNT(*) 选择代价小的索引扫描
近似值MySQL 看统计信息估算;PG 用 reltuples(ANALYZE 后更新)
高频精确计数维护计数表或增量汇总,把成本转移到写入侧

易错点

  • 拿 information_schema.tables 的行数当精确值:InnoDB 为估算值,与真实行数可能差距明显
  • 在高频接口里实时 COUNT 大表:改为缓存或汇总表,避免每次请求全量扫描

数据来源与参考

  • MySQL 8.0 Reference Manual · Aggregate Function Descriptions
  • PostgreSQL Documentation · Aggregate Functions
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌