【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…

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

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

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…

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

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

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 数组操…

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

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

蓝桥杯-求阶乘

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

【Git教程】(九)版本标签 —— 创建、查看标签,标签的散列值,将标签添加到日志输出中,判断标签是否包含特定的提交 ~

Git教程 版本标签&#xff08;tag&#xff09; 1️⃣ 创建标签2️⃣ 查看存在的标签3️⃣ 标签的散列值4️⃣ 将标签添加到日志输出中5️⃣ 判断tag是否包含特定的提交&#x1f33e; 总结 大多数项目都是用 1.7.3.2和 “ gingerbread” 这样的数字或名称来标识软件版本的。在 …

数字图像处理与交叉学科中名词的拧巴

特征提取 图像处理——对图像、目标或特征点进行定量描述的方法及过程。 模式识别——对原特征进行特征变换&#xff0c;从高维空间到低维空间映射。 特征向量 模式识别、图像处理——一个观测包括多个变量&#xff0c;样本的多个特征组成特征向量。 线性代数——特征值对应的…

[闲聊统计]之参数估计是什么?(下)

我们在前面说了一下参数估计中的点估计&#xff0c;接下来&#xff0c;我们来讲一下区间估计。 区间估计——在点估计的基础上&#xff0c;给出总体参数估计的一个估计区间&#xff0c;该区间由样本统计量加减估计误差而得到。 置信水平——如果将构造置信区间的步骤重复多次&a…

javaWeb新闻发布及管理系统

摘 要 随着电脑、智能手机等能够连接网络设备的家庭化和大众化&#xff0c;各种网站开始被设计和开发出来&#xff0c;功能多种多样&#xff0c;涉及的领域也各有不同&#xff0c;生活、商业、科技等等。而信息的发布是网络的一大特点&#xff0c;人们上网的主要需求就是汲取自…

中高级前端需要掌握哪些Vue底层原理

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

javase_进阶 day10 集合2

泛型介绍 JDK5引入的, 可以在编译阶段约束操作的数据类型, 并进行检查注意 : 泛型默认的类型是Object 泛型的好处 统一数据类型&#xff0c;将运行期的错误提升到了编译期统一数据类型 常见的泛型标识符 : E V K T E : Element T : Type K : Key(键) V : Value(值)总结&am…

基于SSM+Jsp+Mysql的二手车交易网站

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

《高通量测序技术》分享,生物信息学生信流程的性能验证,以肿瘤NGS基因检测为例。

这是这本书&#xff0c;第四章第五节的内容&#xff0c;这一部分是以NGS检测肿瘤基因突变为例&#xff0c;描述了其原理和大概流程&#xff0c;这和以前我分享的病原宏基因组高通量测序性能确认方案可以互相补充&#xff0c;大家可以都看一下&#xff0c;但是想要真正的弄懂&am…

JS-27-操作表单

用JavaScript操作表单和操作DOM是类似的&#xff0c;因为表单本身也是DOM树。 不过表单的输入框、下拉框等可以接收用户输入&#xff0c;所以用JavaScript来操作表单&#xff0c;可以获得用户输入的内容&#xff0c;或者对一个输入框设置新的内容。 一、HTML表单的输入控件 H…