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

MySQL 大数据量分页查询优化指南

问题分析

当对包含50万条记录的edu_test表进行分页查询时,发现随着分页越深入,查询时间越长:

  • limit 0,10:0.05秒
  • limit 200000,10:0.14秒
  • limit 499000,10:0.21秒

通过EXPLAIN分析发现,limit offset, size会进行全表扫描,扫描后从offset位置开始取size条记录返回。

优化方案

方案1:通过有序唯一索引缩小扫描范围

-- 使用主键范围查询
SELECT * FROM edu_test WHERE id > 499000 ORDER BY id ASC LIMIT 10;
-- 执行时间:0.14秒-- 进一步缩小扫描范围
SELECT * FROM edu_test WHERE id BETWEEN 499000 AND 499020 ORDER BY id ASC LIMIT 10;
-- 执行时间:0.09秒

优点:利用索引快速定位,减少扫描数据量
前提:必须使用有序且唯一的字段(如自增主键)

方案2:子查询优化

SELECT * FROM edu_test 
WHERE id >= (SELECT id FROM edu_test ORDER BY id LIMIT 499000, 1) 
LIMIT 10;
-- 执行时间:0.16秒

方案3:JOIN查询优化

SELECT s.* FROM edu_test s
JOIN (SELECT id FROM edu_test ORDER BY id LIMIT 499000, 10) t
ON s.id = t.id;
-- 执行时间:0.16秒

方案2和3的共同优点

  • 先通过索引快速定位到起始ID
  • 再通过主键精确查询所需记录
  • 避免了全表扫描

实际业务应用建议

  1. 主键设计原则

    • 保持主键唯一且有序(推荐自增ID)
    • 避免使用业务逻辑复杂的字符串作为主键
    • 考虑热点业务场景,减少回表操作
  2. 复杂场景处理

    • 对于分布式ID或字符串主键,可使用WHERE id LIKE '10289%'先缩小范围
    • 考虑添加辅助索引优化特定查询场景
  3. 性能权衡

    • 简单分页(前几页):直接使用LIMIT
    • 深度分页:采用优化方案
    • 考虑使用"上一页/下一页"替代具体页码跳转

通过合理的主键设计和查询优化,可显著提升大数据量下的分页查询性能。

http://www.xdnf.cn/news/2555.html

相关文章:

  • Git 撤回合并提交
  • WPF之XAML基础
  • AlexNet网络搭建
  • OneNet云平台
  • java16
  • Java快速上手之实验五
  • 若依脱敏功能升级:接口返回想脱就脱,想不脱就不脱(实现灵活可控制的数据脱敏)
  • 手撕——贪吃蛇小游戏(下)
  • 【quantity】1 创建 crates.io 账号并上传 Rust 库
  • 数据库查询艺术:从单表操作到多表联查的全面指南
  • Rollup、Webpack、Esbuild 和 Vite 前端打包工具
  • Redis01-基础-入门
  • 华为仓颉编程语言的实际用法与使用领域详解
  • OpenCV实验室工具的使用
  • 【银河麒麟高级服务器操作系统】在VMware虚拟机情况下出现软锁处理过程
  • C/C++死锁和活锁
  • k8s学习记录(五):Pod亲和性详解
  • 解决两个技术问题后小有感触-QZ Tray使用经验小总结
  • 分布式GPU上计算长向量模的方法
  • 数据一致性问题剖析与实践(四)——竞态条件竞争导致的一致性问题
  • 制作一款打飞机游戏26:精灵编辑器
  • streamlit实现非原生的按钮触发效果 + flask实现带信息的按钮触发
  • Pikachu靶场-PHP反序列化漏洞
  • 2024ICPC网络赛第二场题解
  • DeepSeek:重构人类文明的智能引擎
  • JVM——运行时数据区
  • NLP预处理:如何 处理表情符号
  • 基于物理信息的神经网络在异常检测Anomaly Detection中的应用:实践指南
  • 解决Cline的Shell Integration Unavailable问题
  • 软考:软件设计师考试数据结构知识点详解