当前位置: 首页 > news >正文

【MySQL】3分钟解决MySQL深度分页问题

什么是深度分页问题?该如何解决呢?这篇文章展开讲讲

什么是深度分页?

当查询结果集非常大时,需要获取靠后页码的数据,比如第1000页、10000页。

如:

SELECT * FROM table LIMIT 10000, 10;  -- 获取第10001-10010条记录

深度分页的性能如何?

1.全表扫描:MySQL需要先读取10010行,然后丢弃前10000行
2.内存消耗:临时存储大量中间结果
3.IO压力:需要加载大量数据页到内存
4.响应时间:随着offset(偏移量)增大,查询时间线性增长

二、解决方案对比:

1.游标分页:

原理:记录上一页最后一条记录的ID,作为下一页的查询条件

-- 第一页
SELECT * FROM table ORDER BY id LIMIT 10;-- 后续页(假设上一页最后id=10)
SELECT * FROM table WHERE id > 10 ORDER BY id LIMIT 10;

优点:

  • 时间复杂度为O(1)
  • 无性能衰减

缺点:

  • ID必须是连续自增的
  • 不支持跳页

2.延迟关联:

原理:先通过覆盖索引获取ID,再关联原表

SELECT t.* FROM table t
JOIN (SELECT id FROM table ORDER BY col LIMIT 100000, 10) tmp
ON t.id = tmp.id;

优点:

  • 减少回表操作
  • 比LIMIT快5-10倍

缺点:

  • 需要复杂排序的分页
  • 不能使用游标分页时

相关文章:

  • 一种专用车辆智能配电模块的设计解析:技术革新与未来展望
  • C#并行编程极大提升集合处理速度,再也没人敢说你程序性能差了!
  • 【信息系统项目管理师】高分论文:论成本管理与采购管理(信用管理系统)
  • 高校学子走进万物纵横:体验边缘计算前沿技术,共探产业创新未来
  • 38 python random
  • 数据结构初阶:排序
  • 什么是可重入锁ReentrantLock?
  • day01_编程语言介绍丶Java语言概述丶开发环境搭建丶常用DOS命令
  • volatile缓存可见性实现原理
  • 解决Spring Boot多模块自动配置失效问题
  • 【MFC】 VS2022打开低版本的MFC,双击.rc文件,DIalog加载失败,页面弹窗fatal error RC***:cannot open*****
  • 使用 AI Agent 改善师生互动的设计文档
  • 探秘LLM推理模型:hidden states中藏着的self verification的“钥匙”
  • 串口通讯协议文档
  • SpringCloud搭建Eureka注册中心
  • 【重磅】敲敲云桌面版正式发布!
  • 销售新人必看!5大秘籍助你快速上手,告别迷茫!
  • 07 Python 字符串全解析
  • Java从入门到“放弃”(精通)之旅——JavaSE终篇(异常)
  • AI 开发工具提示词集体开源!解锁 Cursor、Cline、Windsurf 等工具的核心逻辑
  • 仅退款正式成历史?仅退款究竟该不该有?
  • 杨荫凯履新浙江省委常委、组织部部长,曾任中央财办副主任
  • 高糖高脂食物可能让你 “迷路”
  • 经济日报刊文:积极应对稳住外贸基本盘
  • “两高”司法解释:升档为境外非法提供商业秘密罪的量刑标准
  • 央行上海总部:上海个人住房贷款需求回升,增速连续半年回升