在 MySQL 的 InnoDB 存储引擎中,几千万级别的大表频繁执行 性能极差是一个经典的痛点。 为什么 InnoDB 的 这么慢? 与 MyISAM 引擎将表总行数缓存在元数据中不同,InnoDB 支持事务和多版本并发控制(MVCC)。在同一时刻,不同的事务看到的表行数可能是不同的。因此,InnoDB 不能简单地读一个缓存值,而是必须扫描全表(或扫描整个二级索引树)来逐行计算当前事务可见的行数。几千万行的扫描,必然带来巨大的磁盘 I/O 和 CPU 消耗。 针对这个问题,通常有以下几种替代方案或优化手段,需要根据你的业务对计数的精确度要求来选择: --- 方案一:业务不需要 100% 精确的总数(推荐) 如果你的场景是类似百度搜索结果的“为您找到相关结果约 10,000,000 个”,不需要绝对精确,可以使用以下秒级返回的方案: 1. 使用 获取预估值 通过 语句解析目标表,读取 字段。这个值是 MySQL 优化器通过采样估算出来的,非常快。 优点: 耗时几乎为 0。 缺点: 误差大概在 10% - 20% 左右。 2. 使用 读取返回结果中的 字段,原理与 类似,也是统计信...