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

news2025/6/24 7:18:53

前言:

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,10

select * 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 
on
     e.id = ed.id

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

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

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

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

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

总结:

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

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

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


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

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

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

相关文章

【QT+QGIS跨平台编译】175:【QGIS_App跨平台编译】—【错误处理:未定义的class APP_EXPORT】

点击查看专栏目录 文章目录 一、未定义的class APP_EXPORT二、错误处理 一、未定义的class APP_EXPORT 报错信息: 二、错误处理 第18行增加: #include "qgis_app.h"

【MYSQL锁】透彻地理解MYSQL锁

🔥作者主页:小林同学的学习笔录 🔥mysql专栏:小林同学的专栏 目录 1.锁 1.1 概述 1.2 全局锁 1.2.1 语法 1.2.1.1 加全局锁 1.2.1.2 数据备份 1.2.1.3 释放锁 1.2.1.4 特点 1.2.1.5 演示 1.3 表级锁 1.3.1 介绍 …

区块链:开启信任的新时代

区块链是一种基于去中心化、分布式的数据存储、传输、记录和验证的数据库技术。它通过一串使用密码学算法链接起来的区块,形成了一个公开透明、不可篡改的数据记录系统。 区块链技术的核心特点就是去中心化。在传统的中心化系统中,数据存储和记录往往由…

正则表达式 速成

正则表达式的作用 正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字…

蓝桥杯嵌入式速成

蓝桥杯嵌入式速成 cubmx创建工程利用官方提供的LCD代码创建工程(15届不能用)利用官方提供的LCD代码创建工程(15届能用)Keil配置头文件注意其他注意 LED闪烁 按键短按长按双击 LCD高亮行高亮字符 RTCADCI2Cuart接收发送 PWMDAC定时…

c++的学习之路:22、多态(1)

摘要 本章主要是说一些多态的开头。 目录 摘要 一、多态的概念 二、多态的定义及实现 2.1、多态的构成条件 2.2、虚函数 2.3、虚函数的重写 2.4、C11 override 和 final 2.5、重载、覆盖(重写)、隐藏(重定义)的对比 三、思维导图 一、多态的概念 多态的概念&#…

ELK 企业级日志分析系统 简单介绍

目录 一 ELK 简介 1, elk 是什么 2,elk 架构图 3,elk 日志处理步骤 二 Elasticsearch 简介 1, Elasticsearch 是什么 2, Elasticsearch 的核心概念 3, Elasticsearch 的原理 三 Logstas…

遥感图像处理:从畸变消除到专题信息提取

​ ​ ​在遥感技术的应用中,图像处理是不可或缺的关键步骤。从消除各种辐射畸变和几何畸变,到利用增强技术突出景物的光谱和空间特征,再到进一步理解、分析和判别处理后的图像,这一过程为我们呈现了一幅幅更为真实、清晰的…

uniapp区分app、h5、小程序

APP端 标签内 <!-- #ifdef APP-PLUS --><view> APP端 </view> <!-- #endif --> JSCSS内 /*#ifdef APP-PLUS*/console.log(APP端) /*#endif*/ H5端 标签内 <!-- #ifdef H5 --><view> H5端 </view> <!-- #endif --> JSC…

网盘——登录跳转

在界面设计这块&#xff0c;当登录界面上输入的账号和密码都正确的情况下&#xff0c;直接跳转到好友界面&#xff0c;否则不跳转 1、在opewidget.h里面定义一个单例模式 static OpeWidget &getInstance(); 2、添加定义 产生一个静态的操作界面的对象。操作界面这个对象他…

MapTracker:Tracking with Strided Memory Fusion for Consistent Vector HD Mapping

参考代码&#xff1a;MapTracker 动机与出发点 为了提升帧间检测的稳定性通常会添加时许信息&#xff0c;这个可以BEV特征处做时序融合&#xff0c;也可以是用当前帧query去cross-attn历史帧信息&#xff0c;则更多的时候是将之前帧信息与当前做融合或者cross-attn实现信息传…

ReLU Strikes Back: Exploiting Activation Sparsity in Large Language Models

iclr 2024 oral reviewer 评分 688 1 intro 目前LLM社区中通常使用GELU和SiLU来作为替代激活函数&#xff0c;它们在某些情况下可以提高LLM的预测准确率 但从节省模型计算量的角度考虑&#xff0c;论文认为经典的ReLU函数对模型收敛和性能的影响可以忽略不计&#xff0c;同时…

亚信安慧AntDB-T数据库重分布的实现原理

摘要&#xff1a; 亚信安慧AntDB-T是一款通用企业级、高可用、高性能的原生分布式关系型数据库&#xff0c;具有多种分片方式。在数据库的使用过程中&#xff0c;随着数据的变更和增长&#xff0c;需要重新修改表的分片方式。 AntDB-T数据库支持重分布命令&#xff0c;在内核…

如何在极狐GitLab 启用依赖代理功能

本文作者&#xff1a;徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了如何在[极狐GitLab…

【测试开发学习历程】python面向对象

1 面向对象的基本概念 面向对象&#xff1a;是把构成问题事务分解成各个对象&#xff0c;建立对象的目的不是为了完成一个步骤&#xff0c;而是为了描叙某个事物在整个解决问题的步骤中的行为。 怎么理解面向对象&#xff1f; 面向对象是一种编程思想&#xff0c;就是把要解决…

Substance 3D2024版 下载地址及安装教程

Substance 3D是Adobe公司推出的一套全面的3D设计和创作工具集合&#xff0c;用于创建高质量的3D资产、纹理和材质。 Substance 3D包括多个功能强大的软件和服务&#xff0c;如Substance 3D Painter、Substance 3D Designer和Substance 3D Sampler等。这些工具提供了广泛的功能…

了解大语言模型的参数高效微调(Parameter-Effcient Fine-Tuning)

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 大语言模型在众多应用领域实现了突破性的进步&#xff0c;显著提升了各种任务的完成度。然而&#xff0c;其庞大的规模也带来了高昂的计算成本。这些模型往往包含数十亿甚至上千亿参数&#xff0c;需要…

VRRP虚拟路由实验(华为)

思科设备参考&#xff1a;VRRP虚拟路由实验&#xff08;思科&#xff09; 一&#xff0c;技术简介 VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;是一种网络协议&#xff0c;用于实现路由器冗余&#xff0c;提高网络可靠性和容错能力。VRRP允许多台路由器…

vue商城项目vue shop vite

Vue Shop 是一个基于 Vue.js 框架构建的电子商务平台&#xff0c;它利用了 Vue 的响应式数据绑定和组件化的特点&#xff0c;为用户提供了一种快速开发和部署在线商店的解决方案。Vite 是一种现代化的前端构建工具&#xff0c;它提供了快速的冷启动、即时模块热更新&#xff08…

Elasticsearch:从 ES|QL 到 PHP 对象

作者&#xff1a;来自 Elastic Enrico Zimuel 从 elasticsearch-php v8.13.0 开始&#xff0c;你可以执行 ES|QL 查询并将结果映射到 stdClass 或自定义类的 PHP 对象。 ES|QL ES|QL 是 Elasticsearch 8.11.0 中引入的一种新的 Elasticsearch 查询语言。 目前&#xff0c;它在…