在MySQL单表千万级数据量的场景下, 这种查询被称为深度分页(Deep Pagination)。 为什么它会极慢? MySQL的 机制并不是直接跳到第 行,而是会扫描 行数据,然后丢弃前 行,返回最后 行。 在 的情况下,MySQL会读取100万零20条数据。如果查询包含了非索引列(需要),还会触发100万次的回表(Bookmark Lookup)操作,导致产生海量的随机磁盘I/O和CPU开销,最终导致接口超时。 针对这个问题,作为后端开发/架构师,我会从以下三个维度(SQL优化、产品设计、架构升级)进行综合优化: --- 一、 SQL 与 数据库层面的优化(技术手段) 1. 延迟关联(Deferred Join)—— 推荐(适用于允许跳页) 利用覆盖索引(Covering Index)的特性,先在索引树上快速查出主键ID,然后再通过主键ID去回表查询完整的行记录。这样可以把100万次回表减少到只有20次回表。 优化前: 优化后: 效果: 子查询 会直接走二级索引,不需要回表,速度极快。外层查询做JOIN时,只需要根据20个ID去聚簇索引查数据,性能成百上千倍提升。 2. 游标...