MySQL深分页优化

MySQL中的深分页问题通常是指当我们通过LIMIT语句查询数据,尤其是在翻到较后面的页码时,性能会急剧下降。例如,查询第1000页的数据,每页10条,系统需要跳过前9990条数据,然后才能获取到所需的记录,这在大数据集上非常低效。

传统的深分页实现方法通常是使用OFFSETLIMIT直接做分页查询:

SELECT * FROM table
ORDER BY some_column
LIMIT 9990, 10;

这会导致数据库扫描大量不需要的行然后抛弃它们,才能获取到真正需要的数据。

延迟关联的工作方式

延迟关联通过两步查询优化性能:

  1. 快速定位:首先仅在索引上运行快速查询,快速定位到需要的数据的位置。这个步骤不获取所有字段,只获取主键或者是用于排序的列。

  2. 精确获取:然后根据第一步查询获得的主键(或少数几个列),做第二步的查询以精确获取所有需要的数据字段。

示例:

-- 步骤1: 查询获取需要的主键
SELECT id
FROM table
ORDER BY some_column
LIMIT 9990, 10;-- 步骤2: 根据主键精确获取数据
SELECT *
FROM table
WHERE id IN (/* 步骤1中查询得到的id列表 */);
为什么能提升性能
  • 减少数据扫描量:第一步查询只在索引上运行,大大减少了数据的扫描量。因为索引通常比完整的数据行要小很多,而且数据库可以更有效地在索引上进行排序和分页操作。
  • 减少IO操作:只有在第二步查询中才会获取完整的数据行,这减少了数据库的IO操作,尤其是当表中包含大量大型字段(如TEXTBLOB类型)时。
  • 充分利用索引:通常,第一步的查询能够充分利用索引,使查询效率最大化。

最大ID查询法

使用最大ID查询法,我们利用了数据库中的ID通常是自增(或至少是有序的)这一性质。通过记录上一次查询返回的最后一条记录的ID,下一次查询时,我们只需要选择ID大于这个值的记录,这样避免了扫描和跳过前面所有的记录。

优点
  • 性能提升:这种方法减少了数据库的负载,尤其是对于大数据集。因为它只查询需要的数据,避免了大量的无用扫描。
  • 可扩展性:随着数据量的增加,传统的OFFSET方法性能降低,而最大ID方法的性能下降不明显,适合大数据量的场景。
  • 简单有效:实现简单,但能显著提高分页查询的性能。
缺点
  • 依赖有序的ID:这个方法的有效性依赖于有序的ID(比如自增ID)。如果数据库表中没有一个有序的、单调递增的字段,这种方法就不适用。

  • 不适合复杂排序需求:当查询需要基于其他字段进行排序时,这种方法可能就不再适用。比如,如果需要基于时间或者其他非递增字段进行分页,最大ID方法就不能直接使用了。

  • 数据删除或更新的处理:如果数据表中的记录会被删除,那么这可能会导致某些ID被跳过,从而影响分页的连续性。同样,如果ID是可更新的,那么这种方法也会遇到问题。

  • 非等距分页:使用最大ID进行分页时,如果数据表中存在大量的删除操作,导致ID有较大的间隔,可能会出现每页数据量不一致的情况。虽然通常这不是一个大问题,但在某些应用场景中可能会影响用户体验。

  • 首页数据动态变化:如果你的应用场景需要频繁展示数据的最新状态,使用最大ID分页法可能会导致最新添加的记录不被即时显示。例如,当用户在浏览第二页时,如果首页有新数据添加,用户回到首页可能看不到这些新数据,因为查询的起始ID已经改变。

  • 不适用于随机访问:对于需要直接跳转到指定页面的场景(例如,用户直接跳转到第100页),最大ID方法实现起来比较困难,因为你无法直接知道第100页开始的ID是多少,除非你额外维护一个每页开始ID的映射表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/851267.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue基础面试题(一)

1.Vue的基本原理 Vue.js的核心原理在于其响应式的数据绑定机制,当创建一个Vue实例时,Vue会遍历每个属性,用Object.defineProperty转化为getter和setter。这样使得Vue可以追踪属性的变化,在属性被修改和访问时通知变化。每个组件也…

PostgreSQL的视图pg_tables

PostgreSQL的视图pg_tables pg_tables 是 PostgreSQL 中的一个系统视图,用于显示当前数据库中所有用户定义的表的信息。这个视图提供了关于表的名称、所属模式(schema)、所有者以及表类型等详细信息。 pg_tables 视图的主要列 列名类型描述…

如何提高个人和企业的网络安全意识?

提高个人网络安全意识 个人可以通过以下方式提高网络安全意识: 1. 加强教育和培训:参加网络安全培训课程,学习识别网络攻击的常见迹象、安全密码的设置、不点击可疑链接等知识。 2. 建立网络安全政策:制定个人网络安全规则&…

【Linux】进程3——PID/PPID,父进程,子进程

在讲父子进程之前,我们接着上面那篇继续讲 1.查看进程 mycode.c makefile 我们在zs_108直接编译mycode.c,直接运行,然后我们转换另一个账号来查看这个进程 我们可以通过ps指令来查看进程 我们就会好奇了,第二行是什么&#xff…

基于JavaScript 实现近邻算法以及优化方案

前言 近邻算法(K-Nearest Neighbors,简称 KNN)是一种简单的、广泛使用的分类和回归算法。它的基本思想是:给定一个待分类的样本,找到这个样本在特征空间中距离最近的 k 个样本,这 k 个样本的多数类别作为待…

【C++】<知识点> C++11新特性

文章目录 一、auto关键字 二、decltype关键字 三、nullptr关键字 四、智能指针 五、 无序容器(哈希表) 六、统一的初始化方法 七、成员变量默认初始值 八、范围for循环 九、右值引用与移动语义 十、lambda表达式 一、auto关键字 1. 作用&#…

Linux shell编程学习笔记58:cat /proc/mem 获取系统内存信息

0 前言 在开展系统安全检查的过程中,除了收集cpu信息,我们还需要收集内存信息。在Linux中,获取内存信息的命令很多,这里我们着重研究 cat /proc/mem命令。 1 cat /proc/mem命令 /proc/meminfo 文件提供了有关系统内存的使用情况…

280 基于matlab的摇号系统GUI界面仿真MATLAB程序

基于matlab的摇号系统GUI界面仿真MATLAB程序,输入总数量及摇号需求,进行随机性摇号,并对摇取的号码进行双重随机性数据检测,确定是否符合要求。程序已调通,可直接运行。 280 GUI人机交互 摇号系统GUI界面仿真 - 小红书…

技术前沿 |【大模型InstructBLIP进行指令微调】

大模型InstructBLIP进行指令微调 一、引言二、InstructBLIP模型介绍三、指令微调训练通用视觉语言模型的应用潜力四、InstructBLIP的指令微调训练步骤五、实验结果与讨论六、结论与展望 一、引言 随着人工智能技术的快速发展,视觉语言模型(Vision-Langu…

使用SourceTree切换不同的托管平台

背景:sourcetree一开始绑定了gitee,想拉取github的项目时拉取不了 原因:git绑定的账号(邮箱)、密码不一致 解决办法: 重新设置账号密码 在windows种可找到下面的文件夹,进行删除 C:\Users\US…

5.1 实体完整性

一个表只能有一个主键约束,且主键约束不能取空值。 通过unique约束定义唯一性,为了保证一个表非主键列不输入重复值,可在该列定义unique约束。 primary key约束与unique约束主要区别如下。 (1)一个表只能创建一个primary key约束&#xff0…

让GNSSRTK不再难【第一天】

第1讲 GNSS系统组成以及应用 北斗导航科普动画_哔哩哔哩_bilibili 1.1 GNSS系统 1.1.1 基本概念 全球卫星导航系统(Global Navigation Satellite System, GNSS),是能在地球表面或近地空间的任何地点为用户提供全天候的三维坐标、速度以及…

STM32-电灯,仿真

目录 前言: 一. 配置vscode 二. 新创建软件工程 三. 仿真 1.新建工程想到,选择名称和路径 2.从选中的模板创建原理图 3.不创建PCB布版设计 4.选择没有固件项目 5.完成 四.源码 五. 运行效果 六. 总结 前言: 这篇主要是配置vscode和创建仿真,和点灯的完整代码,欢迎大…

在Windows上用Llama Factory微调Llama 3的基本操作

这篇博客参考了一些文章,例如:教程:利用LLaMA_Factory微调llama3:8b大模型_llama3模型微调保存-CSDN博客 也可以参考Llama Factory的Readme:GitHub - hiyouga/LLaMA-Factory: Unify Efficient Fine-Tuning of 100 LLMsUnify Effi…

美琳莱卡:创新消费模式引领新零售时代

公司成立时间与定位 美琳莱卡自创立之初,便以独特的视角和前瞻性的战略定位,立足于消费市场的变革前沿。公司成立于2024年,正值全球数字化浪潮蓬勃兴起,消费升级趋势日益明显之际。美琳莱卡敏锐地捕捉到这一时代机遇,将自身定位为创新消费模式的引领者,致力于通过线上线下高度…

攻防演练之-网络集结号

每一次的网络安全攻防演练都是各个安全厂商期待的网络安全盛会,因为目前的安全生态导致了只有在网络安全攻防演练期间,网络安全的价值才会走向台前,收到相关方的重视。虽然每一次都会由于各种原因不能如期举行,但是这一次的推迟总…

idea最新专业版安装+maven配置教程!

本教程适用于 J B 全系列产品,包括 Pycharm、IDEA、WebStorm、Phpstorm、Datagrip、RubyMine、CLion、AppCode 等。 (直接复制,拿走不谢) 9H1390TRAK-eyJsaWNlbnNlSWQiOiI5SDEzOTBUUkFLIiwibGljZW5zZWVOYW1lIjoi5rC45LmF5rA5rS7I…

MySQL之查询性能优化(七)

查询性能优化 排序优化 无论如何排序都是一个成本很高的操作,所以从性能角度考虑,应尽可能避免排序或者尽可能避免对大量数据进行排序。前面已经提到了,当不能使用索引生成排序结果的时候,MySQL需要自己进行排序,如果…

【传知代码】上下位关系自动检测方法(论文复现)

前言:在信息爆炸的时代,我们每天都沉浸在海量的数据和信息中。随着互联网技术的飞速发展,如何从这些信息中准确、高效地提取出有用的知识,成为了当下研究的热点。其中,上下位关系(也称为层级关系或种属关系…

vscode 中 eslint 无效?npm init 是什么?

vscode 中 eslint 无效 我想要给一个项目添加 eslint,按照 eslint 官方指南操作: npm init eslint/configlatest自动安装了相关依赖并创建配置文件 eslint.config.mjs。 按理说,此刻项目应该已经配置好 eslint 了。但是我的编辑器 vscode …