【MySQL数据库 | 第二十四篇】Limit语句的性能问题和调优策略

前言:

MySQL作为最流行的关系型数据库管理系统之一,被广泛应用于各种规模和类型的应用程序中。其强大的功能和灵活的查询语言使得开发人员能够高效地执行各种数据操作和分析。

然而,在处理大量数据或复杂查询时,一些开发人员可能会遇到性能问题,其中一个常见的问题就是与LIMIT子句相关的性能问题。

目录

前言:

Limit:

调优策略:

1.主键连续自增情况:

 2.根据非主键字段排序的分页查询:

3.记录上一次分页查询的最大id。

总结:


Limit:

这是我们在查询过程中会经常使用到的一个关键字,用于分页操作。下图为一个实例

比方我们要在这张表中执行这样一条语句:

select * from emp limit 3,5

 也就是从这张表的第三条数据开始,往后查五条数据。下图为查询结果:

而这条语句真正的执行过程为:从第一条数据开始,往后查询八条数据,然后丢弃掉前三条数据

从这里其实就能看出:一般的Limit语句在小数据量的表中的查询性能可能还不受限,当在数据量大的表中查询表末的数据的时候性能就会出现明显瓶颈,比如:

select * from table limit 10000000,10

那么在这条语句中,我们要先查询10000010条记录,然后抛弃前10000000条记录,返回剩余的十条记录。而这就是传统的limit语句存在的性能问题。

调优策略:

1.主键连续自增情况:

如果我们的主键是连续且自增的,那么以下两条SQL语句的执行结果是一样的(案例中的id是主键):

select * from emp  limit 999990,10select * from emp where id > 999990 limit 10

我们分别来看一看两个SQL的执行计划:

select * from emp  limit 999990,10

select * from emp where id > 999990 limit 10

相比之下,我们可以看出当我们采用>999990这种简单的优化之后,查询的type由全表ALL变为了range。

但是这种简单的调优在大多数情况下都不合适,因为我们的业务中基本都会存在删除的业务,可能会破坏主键的连续性。

而且如果原SQL是order by 非主键的字段,那么就会造成这两条SQL语句查询结果的不一致,

这种改写必须满足两个条件:主键自增且连续,结果是按照主键递增的。

 2.根据非主键字段排序的分页查询:

比如我们要根据name进行排序并分页:

select * from emp order by name limit 10,5

这条语句中name是非主键字段,那么这条语句就不会走索引,通过查看执行计划可以得知:

那么其实我们的整体优化思路就是:让排序的时候尽可能返回字段减少,我们先通过排序和分页操作查询出主键,再根据主键去查找对应的记录。

 也就是这样一条SQL语句:

select * from emp e 
inner  join (select id from emp order by name limit 10,5) ed 
one.id = ed.id

这样的话,我们的两次查询一次先通过子查询查出指定范围内的id,再查询出id对应的记录,查看这条的执行计划:

优化后的索引使用的排序成为了索引排序。

3.记录上一次分页查询的最大id。

这种方法其实是第一个方法的变种,当我们不断的记录上一次查询的最大id的时候,我们就可以不断的把SQL语句优化为:

select * from emp where id > (记录上一次最大id) limit 返回条数

总结:

在数据库查询中,使用LIMIT关键字可以限制返回的结果数量,这在处理大数据集或深度分页时特别有用。然而,使用LIMIT也可能导致性能问题。本文讨论了一些与LIMIT关键字相关的性能问题,并提出了一些解决方案。

首先,我们探讨了LIMIT的工作原理以及它如何影响数据库的性能。我们了解到,LIMIT可能会导致数据库在执行查询时遍历大量数据,这会增加查询的时间和资源消耗。

综上所述,虽然LIMIT在处理大数据集或深度分页时非常有用,但我们在使用时也需要注意可能带来的性能问题。通过合理优化查询和选择合适的解决方案,我们可以最大程度地提高数据库的性能,从而提升系统的整体效率和用户体验。


如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

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

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

相关文章

Linux网卡:连接虚拟与现实的桥梁

在介绍Linux网卡之前,让我们先迈入时光机🕰️,回到1980年代末期,互联网正在逐步从一个科研网络向公众网络转变,Linux——一个自由和开源的操作系统诞生了🐧。Linux的出现,对于计算机科学领域来说…

非线性滤波相位解缠算法

相位解缠是InSAR数据处理流程中较为关键的步骤,同时也是地表高程模型重建 过程中的主要误差来源之一。迄今为止,针对干涉图的相位解缠问题,已经提出了各 种各样的相位解缠算法,这些算法大致可以分为以下几类:①路径跟踪…

DSP笔记13-时间基准子模块Time base(TB)比较子模块Counter cpmpare(CC)

时间基准子模块Time base(TB) 同步,计数 CTR计数寄存器 PRD周期寄存器 CMP比较寄存器,占空比 EPWMA, EPWMB,两个比较寄存器,但只有以及计数寄存器以及一个周期寄存器 计数模式 计数时钟TBCLK HSPCLKDIVx x0,分…

《QT实用小工具·二十三》 Ntp校时类

1、概述 源码放在文章末尾 该项目实现了 Ntp校时类 ,包含如下功能: 可设置Ntp服务器IP地址。 推荐用默认的阿里云时间服务器 ntp1.aliyun.com 收到时间信号发出。 时间精确到秒。 下面是demo演示: 项目部分代码如下: #if…

解决Jenkins中Node和Yarn路径问题:‘No such file or directory‘

在Jenkins中使用Node.js和Yarn时,可能会遇到 No such file or directory 错误。这通常是因为Jenkins构建环境没有正确设置PATH环境变量,导致它无法找到Node.js或Yarn的执行文件。以下是几种解决这个问题的方法,确保您的CI/CD流程顺利运行。 …

在线视频下载工具lux(原annie)安装及使用教程

安装教程 下载ffmpeg,参考这篇文章:Python——Windows下载ffmpeg由于博主的系统为windows,所以选择不安装lux,直接下载.exe文件,进入lux的github网站后,选择右侧的Releases,下载下图的windows …

渗透测试常见端口总结

21端口渗透剖析 FTP通常用作对远程服务器进行管理,典型应用就是对web系统进行管理。一旦FTP密码泄露就直接威胁web系统安全,甚至黑客通过提权可以直接控制服务器。这里剖析渗透FTP服务器的几种方法。 基础爆破:FTP爆破工具很多,…

SpringBoot删除菜品模块开发(SpringMVC分割参数、事务管理、异常处理、批量删除)

需求分析与设计 一:产品原型 在菜品列表页面,每个菜品后面对应的操作分别为修改、删除、停售,可通过删除功能完成对菜品及相关的数据进行删除。 删除菜品原型: 业务规则: 可以一次删除一个菜品,也可以批…

【proteus仿真】定时器0中断实验

#include <REGX51.H> sbit LED1P2^0; void delay(unsigned int ten_s) {while(ten_s--); } void inittime0(void) {TMOD0x01;//选择为定时器0模式&#xff0c;工作方式1TH00xFC;//初值65536-100064536FC18H,定时1msTL00x18;ET01;//打开定时器0中断允许EA1;//打开总中断TR…

取消请求实战

关于前端取消请求&#xff0c;大多数文章都是new AbortController() 然后将signal放到请求中&#xff0c;然后执行abort取消&#xff0c;这种文章怎么好意思拿出来啊&#xff0c;mmmmini版的官方文档罢了。 首先要明确我们想要的效果是什么&#xff0c;可以对比一下toast.show…

InternLM2 技术报告——社区翻译版

InternLM2技术报告于近日正式对外发布&#xff0c;不少社区大佬自发地参与到报告的翻译与解读中来。本文为社区用户翻译的InternLM2技术报告原文&#xff0c;分享给大家~ 论文地址&#xff1a; https://arxiv.org/pdf/2403.17297.pdf 摘要 大型语言模型&#xff08;LLMs&…

红队内网攻防渗透:内网渗透之内网和域信息收集

红队内网攻防渗透 1.内网渗透之信息收集1.内网信息收集的目的2.本机信息收集网络配置查询操作系统及版本信息查看系统体系结构查看安装的软件及版本、路径等查询本机服务查询进程列表查毒软件查看启动程序信息查看计划任务查看主机开机时间查询用户列表获取本地管理员查看当前在…

unity的引用传递和数组的联系

引用传递 //引用传递 static void SetY(out int x,out int y ){x 0;y 0;x 1000;}static void Main(string[] args){int x 0;int y 10;SetY(out x, out y);Console.WriteLine($"x{x},y{y}");} 结果是&#xff1a;x1000&#xff0c;y0 数组的引用传递 数组值…

Linux 创建命令

在学习linux操作系统时,一般从最基本的cd、pwd命令,到常用命令mkdir、cat、df等,再到高级命令sed、awk、nmcli、crontab等,学习linux时会遇到大量命令。当我们不会使用时,可以借助man、info、--help等,查看如何使用,从中学习选项、参数等设置方法。 当进一步学习bash编…

Java基础常见面试总结

文章目录 1. 变量、数据类型转换、运算符1.1 变量1.2 数据类型转换1.2.1强转的注意事项 1.3 进制的转换1.4 位运算符1.5 运算符1.6 三元运算符 2. 流程控制2.1 键盘录入_Scanner2.2 Random随机数2.3 switch(选择语句)2.4 分支语句2.5 循环语句 3. 数组3.1 数组的定义3.2 数组操…

LeetCode热题100

一丶哈希 1、两数之和 方法一&#xff08;自己想到&#xff09;&#xff1a;暴力枚举&#xff0c;两次循环遍历所有相加的情况 class Solution {public int[] twoSum(int[] nums, int target) {for(int i0;i<nums.length;i){for(int ji1;j<nums.length;j){if(nums[i]nu…

证件照小于30kb怎么弄?这个工具三步搞定

当我们需要将照片上传到各种平台时&#xff0c;常常会遇到图片文件大小限制的问题。无论是社交媒体平台还是工作需求&#xff0c;如果照片文件过大&#xff0c;系统会提示上传失败或无法上传。想要解决的这个问题&#xff0c;可以选择将图片压缩指定大小&#xff0c;比如图片压…

蓝桥杯-求阶乘

问题描述 满足 N!的末尾恰好有 区 个o的最小的 N 是多少? 如果这样的 N 不存在输出 -1。 输入格式 一个整数 区。 输出格式 一个整数代表答案。 样例输入 样例输出 10 评测用例规模与约定 对于 30% 的数据,1<K<106 对于 100% 的数据,1<K<1018 运行限制 最大运行时…

Redis 分区:构建高性能、高可用的大规模数据存储解决方案

在 Redis 中&#xff0c;分区是一种将数据分布在多个实例上的技术&#xff0c;用于处理大规模数据和提高系统性能。通过分区&#xff0c;可以将数据均匀地分布在多个节点上&#xff0c;从而减轻单个节点的负载压力&#xff0c;并实现水平扩展。 Redis 分区应用场景 1. 大规模…

Go语言中如何处理goroutine和循环变量

对goroutine和循环变量处理不当可能是Go开发人员在编写并发应用程序时最常犯的错误之一。让我们看一个具体的例子,然后我们将定义发生此类错误的条件以及如何防止发生这类错误。 在下面的示例中,我们初始化一个切片,然后在作为新goroutine执行的闭包中访问这个元素: s := …