【高频面试题】深分页问题

什么是深分页

limit 100000,10 含义:去掉前面 10 万条,取后面 10 条,就是深分页。

语法:limit offset, rows

  • offset = 要跳过多少行
  • rows = 最终返回多少行

limit 100000,10:

先读 100000 + 10 = 100010 条数据,前面 10 万条直接扔掉,只把最后 10 条返回给你。

为什么慢

MySQL 不是直接跳到第 10 万行。 它会先查出前 100010 条,丢掉前面 10 万条,只返回最后 10 条。 要扫描大量数据,大量回表,IO 很高,越往后越慢。

优化方案(两个常用)

  1. 主键 id 分页(推荐,又叫书签分页)
sql 复制代码
select * from order where id > 100000 limit 10;

记住上一页最大 id,下一页直接从这个 id 往后查,不用扫描前面数据。 前提:主键连续有序。

  1. 先查 id,再 join 拿数据
sql 复制代码
select * from order t1 inner join (select id from order limit 100000,10) t2 on t1.id=t2.id;

子查询只扫描主键索引(不走回表),拿到 id 再查完整数据,减少回表开销。

缺点 & 注意

  • 主键分页不支持跳页(不能直接跳到第 5000 页),适合下拉滚动加载。
  • 如果业务需要任意页码跳转,深分页很难优化,一般业务上限制最大页码,不让用户查很深的页。
相关推荐
SelectDB12 小时前
让变更流出 Doris:Apache Doris 5.0 基于增量计算的 CDC 技术解析
数据库
这个DBA有点耶12 小时前
MCP隔离层+行级语义审计+输出校验:AI访问数据库的安全边界拆解
数据库·人工智能·ai编程
这个DBA有点耶13 小时前
从反向扫描O(n)到正向扫描O(1):降序索引的物理机制与混合排序匹配规则
数据库
2501_9339232514 小时前
解读Redis:单线程模型
数据库·redis·缓存
Tapdata16 小时前
被忽略的第三类上下文:Agent 进入真实业务后,还缺什么?
数据库·人工智能·架构
小科先生17 小时前
Java springboot调用数据库的基本流程
java·数据库·spring boot
星恒随风17 小时前
MySQL 从零入门(四):表的增删改查与基础查询详解
linux·服务器·数据库·笔记·mysql
Pniubi19 小时前
MySQL靠什么实现事务的?事务隔离级别有哪些?
java·数据库·mysql
数据库小学妹19 小时前
pgbouncer 事务池:prepared statement、临时表与会话状态
数据库·后端·postgresql
aiks_yuan19 小时前
MySQL 死锁怎么排查:看懂 INNODB STATUS 死锁日志,先查后插为什么必死锁(MySQL 8.2 实测)
mysql