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

MySQL深分页性能优化实战:大数据量情况下如何进行优化

概要

当MySQL查询遇到LIMIT 10 OFFSET 1000000深分页问题时,数据库可能正在执行一个看似简单实则昂贵的操作——扫描并丢弃前100万行记录。本文将深入探讨深分页问题的本质,并提供多种高效解决方案。

问题现象:为什么OFFSET 1000000如此缓慢?

查询示例:

SELECT * FROM orders 
ORDER BY create_time DESC 
LIMIT 10 OFFSET 1000000; 

性能瓶颈分析:

  • 全量扫描:MySQL必须读取前1,000,010行数据
  • 排序开销:对所有扫描行进行排序操作
  • 内存压力:大偏移量导致临时表可能使用磁盘存储
  • 无效丢弃:最终丢弃前1,000,000行数据

优化方案

方案一:延迟关联

SELECT o.* 
FROM orders o
JOIN (SELECT idFROM orders ORDER BY create_time DESC LIMIT 1000000, 10
) AS tmp ON o.id = tmp.id
ORDER BY create_time DESC;

优化原理:

  • 子查询先执行:在覆盖索引 (create_time, id) 中直接定位 10 条目标数据的主键
  • 减少数据扫描:子查询只需扫描索引(100万+10行),无需访问实际数据行
  • 外层精确获取:通过主键快速获取 10 条完整数据

方案二:游标分页

-- 获取第一页
SELECT * FROM orders 
ORDER BY create_time DESC 
LIMIT 10;-- 获取下一页(使用上一页最后一条记录的create_time)
SELECT * FROM orders 
WHERE create_time < '2023-06-01 12:00:00' 
ORDER BY create_time DESC 
LIMIT 10;

优化原理:

  • 完全消除OFFSET
  • 仅扫描目标数据行

方案三:ID范围限定法(ID有序场景)

SELECT *
FROM orders 
WHERE id > (SELECT id FROM orders ORDER BY create_time DESC LIMIT 1000000, 1
)
ORDER BY create_time DESC
LIMIT 10;

优化原理:

  • 子查询先通过覆盖索引快速定位到起始ID
  • 主查询通过主键ID范围过滤
http://www.dtcms.com/a/339736.html

相关文章:

  • MySQL 三大日志:redo log、undo log、binlog 详解
  • 面试题储备-MQ篇 1-说说你对RabbitMQ的理解
  • 3D检测笔记:MMDetection3d环境配置
  • 基于单片机智能手环/健康手环/老人健康监测
  • DataSourceAutoConfiguration源码笔记
  • 47 C++ STL模板库16-容器8-关联容器-集合(set)多重集合(multiset)
  • Lec. 2: Pytorch, Resource Accounting 课程笔记
  • 告别手写文档!Spring Boot API 文档终极解决方案:SpringDoc OpenAPI
  • 一文速通Ruby语法
  • GeoTools 读取影像元数据
  • 常见 GC 收集器与适用场景:从吞吐量到亚毫秒停顿的全景指南
  • Kotlin 相关知识点
  • 驱动开发系列66 - glCompileShader实现 - GLSL中添加内置函数
  • 从“为什么”到“怎么做”——Linux Namespace 隔离实战全景地图
  • [激光原理与应用-309]:光学设计 - 什么是光学系统装配图,其用途、主要内容、格式与示例?
  • 线性基 系列
  • Java static关键字
  • OptiTrack光学跟踪系统,提高机器人活动精度
  • 讯飞星火语音大模型
  • CAD图纸如何批量转换成PDF格式?
  • 机器学习概念(面试题库)
  • 部署tomcat应用时注意事项
  • vue3+element-plus 输入框el-input设置背景颜色和字体颜色,样式效果等同于不可编辑的效果
  • t-SNE详解与实践【附代码】
  • 自定义组件可使用的方法
  • 在 Python 中操作 Excel 文件的高效方案 —— Aspose.Cells for Python
  • 《P1550 [USACO08OCT] Watering Hole G》
  • Java开发过程中实用的技术点(一)
  • 【矢量数据】1:250w中国地质图地断层数据/岩性shp数据
  • FlashAttention编译错误