MySQL面试题 如何解决深分页?

深分页为什么会慢?

深分页select * from table limit offset,size它不是跳过offset条,而是从第一条开始扫描,舍弃前面的offset条,最后再取出size条数据

所以offset越大,需要扫描的行数就越多,就会越慢

深分页怎么解决?

1.子查询+覆盖索引

子查询就是先通过索引定位到起始id,再通过id去主键索引里找数据

sql 复制代码
SELECT *
FROM orders
WHERE id >= (
    SELECT id
    FROM orders
    ORDER BY id
    LIMIT 1000000, 1
)
ORDER BY id
LIMIT 20;

先通过覆盖索引先定位到要要取的二十个主键,再回表查完整数据

sql 复制代码
SELECT o.*
FROM orders o
JOIN (
    SELECT id
    FROM orders
    ORDER BY id
    LIMIT 1000000, 20
) t ON o.id = t.id;
2.游标分页

游标分页就是每次查询都需要先提供上一页的最后一条数据的id,查询时根据这个id跳过前面的数据

sql 复制代码
SELECT *
FROM orders
WHERE id > 1000000
ORDER BY id
LIMIT 20;

游标分页的局限性

  1. 只能一页一页的查询,不能条页
  2. 需要id是递增的
  3. 删除数据可能导致分页错乱。比如用户在看第 2 页时,第 1 页的数据被删了,刷新后原本在第 2 页的内容会"顶"到第 1 页,导致翻页时漏掉部分信息。

业务层面的解决方案

1)限制最大翻页数。Google 搜索、淘宝商品列表都不让你翻到第 10000 页。大部分用户不会真的翻那么多页,限制一下既省资源又合理。

2)改交互方式。无限滚动加载就是典型的游标分页场景,用户感知不到页码,也不需要跳页。

3)缩小数据范围。深度分页通常说明数据量太大,可以引导用户加筛选条件,把结果集控制在合理范围内。

相关推荐
知行合一。。。2 小时前
RAG--03--Milvus基本用法
数据库·oracle·milvus
TDengine (老段)3 小时前
TDengine 线程模型 — 网络、调度、执行
大数据·数据库·物联网·制造·时序数据库·tdengine·涛思数据
上学的小垃圾4 小时前
01-数据库系统概述
数据库
二进制漫游记4 小时前
FastAPI项目集成 Qdrant向量数据库+阿里云Embedding完整实战(工具封装+业务调用)
数据库·python·阿里云·embedding
2501_928996224 小时前
GPT-4o换DeepSeek迁移成本多少?中科热备解析API聚合平台技术账本
前端·数据库·人工智能
泡干脆面就番茄6 小时前
MySQL_子查询_分页查询与联合查询详解
数据库·mysql
devpotato8 小时前
缓存与数据库更新顺序不一致问题
java·数据库·redis
天若有情6738 小时前
Node+MySQL小型全栈笔记项目实战课程分享
数据库·笔记·mysql
wxwx_bscxy3228 小时前
基于springboot宠物领养系统的设计与实现
数据库·spring boot·后端·spring·宠物
九月要晚安9 小时前
达梦DW与AFC对比
数据库