MySQL深度分页优化问题

☆* o(≧▽≦)o *☆嗨~我是小奥🍹
📄📄📄个人博客:小奥的博客
📄📄📄CSDN:个人CSDN
📙📙📙Github:传送门
📅📅📅面经分享(牛客主页):传送门
🍹文章作者技术和水平有限,如果文中出现错误,希望大家多多指正!
📜 如果觉得内容还不错,欢迎点赞收藏关注哟! ❤️

文章目录

  • MySQL深度分页优化问题
  • 一、Limit使用
  • 二、深度分页优化
    • 2.1 范围查询
    • 2.2 子查询
    • 2.3 inner join 延迟关联
    • 2.4 覆盖索引

MySQL深度分页优化问题

一、Limit使用

limit子句可以用于强制select语句返回指定的记录数。

select 字段 from 表名 limit 参数1,参数2;
select 字段 from 表名 limit 参数2 offset 参数1;(为了与 PostgreSQL 兼容)
  • 参数1:指定第一个返回记录行的偏移量,从0开始
  • 参数2:指定返回记录行的最大数目

如果只给定一个参数,那么表示返回的最大记录行数目

如果第二个参数为-1,表示第一个参数的偏移量之后的所有的数据

二、深度分页优化

查询偏移量过大的场景我们称为深度分页,这会导致查询性能较低。比如下面的查询:

# 普通分页查询
test> select * from t_demo order by id limit 1000000, 10
[2024-01-18 20:26:41]396 ms (execution: 346 ms, fetching: 50 ms) 内检索到从 1 开始的 10

这条SQL在执行的过程中,通过非聚簇索引去查询主键,然后拿到主键再通过聚簇索引进行回表查询,查询到满足条件的1000010条数据,丢弃前面的1000000条,返回最后10条。

优化的思路也非常明确:

  • 减少回表的次数
  • 尽量通过索引来查询

2.1 范围查询

当可以保证 ID 的连续性时,根据 ID 范围进行分页是比较好的解决方案:

# 连续id时,根据id范围进行分页
test> select * from t_demo where id > 1000000 and id <= 1000010 order by id
[2024-01-18 20:26:41]69 ms (execution: 8 ms, fetching: 61 ms) 内检索到从 1 开始的 10
# 通过记录上次查询结果的最后一条记录的ID进行下一页的查询
test> select * from t_demo where id > 1000000 limit 10
[2024-01-18 20:26:41]76 ms (execution: 6 ms, fetching: 70 ms) 内检索到从 1 开始的 10

但是一般来说,实际生产中很少会去使用数据库的自增ID,所以这种优化方式的局限性比较大,而且也不是很有必要。

2.2 子查询

阿里《Java开发手册》中也有明确的优化方式:

在这里插入图片描述

我们先来看子查询,子查询的思路是:先查询出 limit 第一个参数对应的主键值,再根据这个主键值再去过滤并 limit,这样效率会高一点。

# 子查询
test> select * from t_demo where id >= (select id from t_demo limit 1000000, 1) limit 10
[2024-01-18 20:26:41]210 ms (execution: 177 ms, fetching: 33 ms) 内检索到从 1 开始的 10

不过,子查询的结果会先产生一张新的表,会影响数据库的性能,所以应该避免使用子查询,并且id>=(...) 也限制了ID必须是递增的,这同样不适用比较复杂的场景。

2.3 inner join 延迟关联

延迟关联的优化思路,跟子查询的优化思路其实是一样的:都是把条件转移到主键索引,然后减少回表。不同点是,延迟关联使用了 INNER JOIN 代替子查询。

# inner join 延迟关联
test> select t1.* from t_demo t1inner join (select id from t_demo limit 1000000, 1) t2on t1.id >= t2.idlimit 10
[2024-01-18 20:26:42]211 ms (execution: 181 ms, fetching: 30 ms) 内检索到从 1 开始的 10

2.4 覆盖索引

索引中已经包含了所有需要获取的字段的查询方式称为覆盖索引。

# 覆盖索引
test> select id, a, b from t_demoorder by alimit 1000000, 10
[2024-01-18 20:26:42]279 ms (execution: 248 ms, fetching: 31 ms) 内检索到从 1 开始的 10

覆盖索引的好处:

  • 避免 InnoDB 表进行索引的二次查询,也就是回表操作: InnoDB 是以聚集索引的顺序来存储的,对于 InnoDB 来说,二级索引在叶子节点中所保存的是行的主键信息,如果是用二级索引查询数据的话,在查找到相应的键值后,还要通过主键进行二次查询才能获取我们真实所需要的数据。而在覆盖索引中,二级索引的键值中可以获取所有的数据,避免了对主键的二次查询 ,减少了 IO 操作,提升了查询效率。
  • 可以把随机 IO 变成顺序 IO 加快查询效率: 由于覆盖索引是按键值的顺序存储的,对于 IO 密集型的范围查找来说,对比随机从磁盘读取每一行的数据 IO 要少的多,因此利用覆盖索引在访问时也可以把磁盘的随机读取的 IO 转变成索引查找的顺序 IO。

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

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

相关文章

RenderDoc 增加 DXBC to HLSL 的 shader viewer

目的 便于后续抓帧出来的 DXBC 转为 HLSL&#xff0c;提高可读性 原因 编写的原因&#xff0c;因为按照网上的大佬的BLOG&#xff0c;发现某个 etnlGD/HLSLDecompiler 上的工具使用上是有问题的 &#xff08;有可能是以前的 render doc 版本没有问题&#xff0c;而我现在是在…

KubeSphere平台使用

KubeSphere官网地址&#xff1a;https://kubesphere.io/zh/ KubeKey一键部署K8S集群&#xff1a;https://kubesphere.io/zh/docs/v3.4/installing-on-linux/introduction/multioverview/ 一台master node&#xff08;初始化主节点&#xff09;、两台 work node&#xff08; joi…

SCI好看的配图-汇总

文章目录 图源&#xff1a;Sustainable Cities and Society【期刊】条形图2热力图-地图 图源&#xff1a;Sustainable Cities and Society【期刊】 引自&#xff1a;A machine learning-driven spatio-temporal vulnerability appraisal based on socio-economic data for COV…

如何编写一个好的测试用例?才能防止背黑锅

如何编写一个好的测试用例&#xff1f;才能防止背黑锅 什么是测试用例&#xff1f;一个好的测试用例包含什么&#xff1f;测试用例的编写思路总结 什么是测试用例&#xff1f; 在这之前&#xff0c;思考一个问题&#xff0c;下面这个简单的QQ登录页面&#xff0c;一共又多少条…

关于运维·关于Zabbix监控平台的面试点

目录 引言&#xff1a;明人不说暗话&#xff0c;今天分享几个在面试的时候常被问到关于Zabbix监控平台的面试点 1、zabbix的优点 2、zabbix的缺点 3、zabbix的监控模式 4、zabbix自定义监控怎么做 5、zabbix的自动发现功能 6、zabbix分布式监控有什么特点 引言&#xff1…

专业130+总分380+哈尔滨工程大学810信号与系统考研经验水声电子信息与通信

今年专业课810信号与系统130&#xff0c;总分380顺利考上哈尔滨工程大学&#xff0c;一年的努力终于换来最后的录取&#xff0c;期中复习有得有失&#xff0c;以下总结一下自己的复习经历&#xff0c;希望对大家有帮助&#xff0c;天道酬勤&#xff0c;加油&#xff01;专业课&…

入门设计者不容错过!5款网页原型设计工具推荐!

即时设计 即时设计是一种支持团队合作的原型设计工具&#xff0c;不限于设备和人群的使用&#xff0c;浏览器可以打开和使用。在即时设计中&#xff0c;您可以从0到1创建一个Web页面原型&#xff0c;具有钢笔、矩形、矢量编辑、轮廓、文本、色彩填充等设计功能&#xff0c;足以…

达梦数据库入门语法:从基础到进阶的指南

目录 博客前言&#xff1a; 达梦数据库语法介绍 一.创建表空间 1.图形化创建 2.语法创建 ​编辑​编辑 3.修改表空间参数 图形化修改 ​编辑​编辑 语法修改 4.设置加密算法、密码 二.创建用户 1.图形化 2.sql执行 ​编辑 3.授予权限 授予用户 DBA 权限 授予用户…

三、RHCE--时间服务器

三、RHCE--时间服务器 一、简介二、软件安装三、配置时间服务器客户端四、配置时间服务器服务端五、示例&#xff1a; 一、简介 NTP 是网络时间协议&#xff08;Network Time Protocol&#xff09;的简称&#xff0c;通过 udp 123 端口进行网络时钟同步。 Chrony是一个开源自由…

k8s---ingress对外服务(traefik)

目录 ingress的证书访问 traefik traefik的部署方式&#xff1a; deamonset deployment nginx-ingress与traefix-ingress相比较 nginx-ingress-controller ui访问 deployment部署 ingress的证书访问 ingress实现https代理访问: 需要证书和密钥 创建证书 密钥 secre…

将 SQL Server 2022 数据库备份到 MinIO

Microsoft 在将 S3 连接器和 Polybase 添加到 SQL Server 2022 时取得了重大飞跃。因此&#xff0c;企业可以利用他们保存到对象存储中的大量数据&#xff0c;并使用它来丰富 SQL Server 表。他们还可以利用对象存储来备份 SQL Server&#xff0c;这是开放性和云原生灵活性的又…

UE4 添加按键输入事件 并在蓝图中使用按键输入节点

绑定按键 选择Edit/ProjectSettings/Engine/Input 在bindings中可以选择添加ActionMappings或则AxisMappings ActionMappings:按键事件&#xff0c;有按下和抬起两个事件&#xff0c;需要分别用两个键触发AxisMappings:输入事件&#xff0c;返回值为float&#xff0c;对于键盘…

每日OJ题_算法_滑动窗口⑤_力扣904水果成篮

目录 力扣904. 水果成篮 解析及代码1&#xff08;使用容器&#xff09; 解析及代码2&#xff08;开数组&#xff09; 力扣904. 水果成篮 904. 水果成篮 - 力扣&#xff08;LeetCode&#xff09; 难度 中等 你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这…

Elastic Stack(1):Elastic Stack简介

1 简介 ELK是一个免费开源的日志分析架构技术栈总称&#xff0c;官网https://www.elastic.co/cn。包含三大基础组件&#xff0c;分别是Elasticsearch、Logstash、Kibana。但实际上ELK不仅仅适用于日志分析&#xff0c;它还可以支持其它任何数据搜索、分析和收集的场景&#xf…

GLM-4多模态重磅更新!摸着OpenAI过河!

智谱CEO张鹏说&#xff1a;OpenAI摸着石头过河&#xff0c;我们摸着OpenAI过河。 摸来摸去摸了一年&#xff0c;以每3-4个月升级一次基座模型的速度&#xff0c;智谱摸着OpenAI过河的最新成绩到底怎么样&#xff1f;真如所说吗&#xff1f; 听到GLM-4发布的当天&#xff0c;我就…

C++深入之虚函数、虚继承与带虚函数的多基派生问题

基础 在讲解带虚函数的多基派生问题时&#xff0c;我们要先弄清楚不带虚函数的多基派生存在什么样的问题&#xff0c;这样才好弄明白带虚函数的多基派生问题。 多基派生的二义性问题 一般来说&#xff0c;在派生类中对基类成员的访问应当具有唯一性&#xff0c;但在多基继承…

Docker(二)安装指南:主要介绍在 Linux 、Windows 10 和 macOS 上的安装

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; 安装 Docker Docker 分为 stable test 和 nightly 三个更新频道。 官方网站上有各种环境下的 安装指南&#xff0c;这里主要介绍 Docker 在…

DAZ to maxon 实时面捕52个blendshapes 表情模板基本形中英文对照表

一、转自&#xff1a; DAZ to maxon 实时面捕52个blendshapes 表情模板基本形中英文对照表 - 哔哩哔哩 很多学员反映实时表情怎么就不同步呢&#xff1f;这个问题其实很常见。 第一&#xff1a;表情模板的顺序弄错&#xff0c;导致表情错乱。 第二&#xff1a;表情模板不标准…

AbstractHttpMessageConverter + easyexcell优雅下载附件

介绍 AbstractHttpMessageConverter 是 Spring 框架中用于处理 HTTP 消息转换的抽象基类。它用于处理来自 HTTP 请求的消息,并将其转换为特定的 Java 对象,或者将 Java 对象转换为 HTTP 响应消息。 这个抽象类允许开发人员创建自定义的 HTTP 消息转换器,以便在 Spring MVC…

职务岗位的概念澄清及应用

背景 现在的企业数字化平台中&#xff0c;有一些术语组织管理中的术语&#xff0c;理解上很有歧义&#xff0c;并且命名和应用上简直五花八门&#xff0c;洋相百出&#xff0c;比如&#xff0c;我们的大厂&#xff0c;就把角色这次&#xff0c;可以作为分类、分组的标签就能大…