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

相关推荐
数据工匠老o2 小时前
一张 5 亿行的表按月分区后,清理历史数据从几小时变成了几秒
数据库·sql
hwscom3 小时前
几分钟开防护,SQL和XSS注入全被护卫神挡住
数据库·sql·xss
石小千3 小时前
Redis开启ACL认证
数据库·redis·缓存
Dxy12393102163 小时前
MySQL JSON 生成列索引原理、实战与坑点
mysql·adb·json
东风微鸣3 小时前
把 Tailscale 接进 Prometheus 监控
java·数据库·prometheus
wno7043 小时前
MYSQL 常用合并函数
android·数据库·mysql
东风微鸣3 小时前
一次断电引发的血案:Ubuntu 26.04 升级中断后的完整救援实录
数据库·ubuntu·postgresql
大侠归来3 小时前
事务能回滚吗?Pipeline 算事务吗?
java·数据库·oracle
临床数据科学和人工智能兴趣组3 小时前
字符串转换为句子风格
大数据·数据库·人工智能·r语言·r语言-4.2.1
夕除4 小时前
PostgreSQL基础
数据库·oracle