SQL优化之LIMIT语法, limit n,m 和 limit n有什么区别?

2023-11-10

 ​​      在某些面试题中会遇到这样的问答或笔试题:“limit 0,1 和 limit 1有什么区别?” 要准确回答这个问题就等深入明白limit一个参数和两个参数的本质区别。

       limit n,m 中的第一次参数n表示的游标的偏移量,初始值为0,第二个参数m表示的是想要获取多少条数据。所以limit 0,1表示的是从第一条记录开始,只取一条即可。limit 1表示的也是只取一条数据,也就是说limit 0,1从结果上来说是等价与limit 1。如果你回答是一样的,那就错了,那么你就钻进套子里了……哈哈哈哈哈……

        我们首先来说一说 limit n,m是怎么回事,首先它要获取到第一个参数游标n的位置,那么它就必须得扫描到n的位置,接着从此位置起往后取m条数据,不足m条的返回实际的数量。那么这就会有一个性能的问题,当游标的数值越来越大时性能就会越来越差。

例如:

我们先创建用户表,再使用plsql插入100万数据:

CREATE TABLE `user` (`ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',`NAME` varchar(45) NOT NULL COMMENT '用户姓名',`NUM` varchar(1) NOT NULL COMMENT '编号',) COMMENT='用户表';
BEGIN DECLARE i INT; START TRANSACTION; SET i=0; WHILE i<1000000 DO INSERT INTO user VALUES(NULL,CONCAT('Java深度编程',i+1),i+1); SET i=i+1; END WHILE; COMMIT; END 

然后我们分别执行sql语句:

select * FROM Sys_User limit 0,10000        //耗时 0.809s
select * FROM Sys_User limit 50000,10000    //耗时 1.654s
select * FROM Sys_User limit 100000,10000   //耗时 3.509s

你会发现按上面分页执行的顺序,执行时间所消耗的cpu会越来越大,执行时间越来越长……

同样是查询10000条记录,为何这三条语句消耗的时候不一样呢?这正是因为游标的偏移量位置不同,偏移量越大,sql语句需要像下扫描的次数就越多,若取到数据的尾部就相当于全表扫描了,所以偏移量越大消耗的性能就越多。

 

LIMIT n 又是什么?

上面已经说过limit0,1等价与limit 1,那他们到底有啥区别呢?

没错,虽然limit 0,1 等价于limit 1,但limit 100,1并不等价于limit 1。其原理也就是上面所说的油表的偏移量问题所带来的性能消耗,limit 100,1 需要先全表扫描到第100条之后再取一条,而limit 1只需要扫描到第一条就结束了。

另外limit 1的写法还可以用于提升sql性能的优化,具体是怎么做的呢?

根据我们上面创建的用户表,执行sql语句:

 SELECT * FROM user WHERE NAME=?;

假设我们上面创建的用户表的姓名是唯一的,那么该语句只会找到1条记录,但如果没有索引的情况下它会进行全表扫描,于是性能低下,但如果将sql语句改成:

SELECT * FROM user WHERE NAME=? limit 1;

这样的话就不会全表扫描,扫描到第一条就会结束了,因为适当的使用limit 1能够提升性能。但此方法对有索引的列无效,也就是说如果NAME这一列加了索引,执行以上两条sql语句效率是一样的。

最后感谢同学们的阅读,愿大家一起学习,一起成长。请大家关注公众号,后续将持续发布更多有用的知识,谢谢大家!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL优化之LIMIT语法, limit n,m 和 limit n有什么区别? 的相关文章

随机推荐

  • Mysql底层数据结构学习总结

    索引数据结构 Mysql数据表中的数据在磁盘中分布位置可能是不连续的 在读取数据时 每读取一条数据就进行一次磁盘IO效率是很低的 为了减少IO次数 索引就诞生了 通过索引 我们可以快速定位到数据位置 增加查询效率 索引是一种排好序的数据结构
  • 深度学习总结——用自己的数据集微调CLIP

    CLIP概述 CLIP Contrastive Language Image Pretraining 是由OpenAI开发的一种深度学习模型 用于将图像和自然语言文本进行联合编码 它采用了多模态学习的方法 使得模型能够理解图像和文本之间的语
  • lbs、agps流程

    AT指令流程 CTZV 19 1 8 8 59 6 23 CIEV service 1 CIEV roam 0 CREG 1 AT CGDCONT 1 IP cmnet AT CGDCONT 1 IP cmnet OK AT CGACT 1
  • RTC和RTMP

    RTC 直播发布流程 offer answer 模型 直播订阅流程 1 使用UDP私有协议来进行媒体拉流 2 适用高互动性的直播场景 如在线教育 电商直播 远程医疗 3 低延时 lt 300ms 和无卡顿 4 快速切换分辨率 无需写上 服务
  • 在多线程中使用tensorRT

    仅记录 转自https www coder work article 4985246 import pycuda autoinit Create CUDA context import pycuda driver as cuda Main
  • Ubuntu ssh连接access deny

    一 尝试了修改配置的方法 不能解决问题 1 修改ssh配置文件vim etc ssh sshd config 设置为允许root远程登录 2 找到PermitRootLogin prohibie password 修改为 PermitRoo
  • windows11 使用 wsl2 安装 archLinux

    windows11 使用 wsl2 安装 archLinux 下载 archLinux 下载 tar gz 文件 下载地址 https mirrors tuna tsinghua edu cn archlinux iso latest 启用
  • 编译ROCKSDB总结

    Rocksdb是挺好的一个东西 就是取得一个可用的库太麻烦 之前我是用的rocksdbsharp里面他有编译好windows 和 linux的库 兼 容性还挺好 ubuntu win10 直接跑没毛病 可惜他是去年build的了 我要用的c
  • C++ - 强引用和弱引用

    原来 我认为 为什么会有引用计数这样的技术 是为了内存自动回收和节省内存 但是读完下面的几节后 内存自动回收是一个原因 但是节省内存并不是真正的原因 真正的原因是有些对象如果被复制在现实中是不合事实的 为什么有引用计数 C 中存在两种语义
  • vite vue3 规范化与Git Hooks

    优质资源分享 学习路线指引 点击解锁 知识定位 人群定位 Python实战微信订餐小程序 进阶级 本课程是python flask 微信小程序的完美结合 从项目搭建到腾讯云部署上线 打造一个全栈订餐系统 Python量化交易实战 入门级 手
  • 在Windows Server2016中安装SQL Server2016

    SQL Server2016安装硬 软件条件 点击打开链接 WinServer2016的安装参见 在虚拟机中安装Windows Server2016 1 SQL Server2016下载地址 1 SQL Server2016安装包 2016
  • SuperPunch - unity3D拳击小游戏项目源码

    SuperPunch是一个完整的项目 准备发布并且适合移动设备 它包含构建顶头拳击游戏的所有必要内容 特征 移动友好的纹理 分层的 包括 SVG 文件 包括 PNG文件 包括 C 脚本 包括文档 包括6架战斗机 包括战士动画 闲置 拳击 受
  • QChart入门教程-绘制正弦曲线

    1 创建界面 将widget作为容器进行绘图 并将widget提升为QChartView类 1 1 单击widget 右键中选择 提升 提升的类名称中填写 QChartView 会自动生成头文件名 选择 添加 将类和头文件添加进要提升的类中
  • ElasticSearch第十八讲 ES-Master节点职责和ES是如何做到数据实时性的

    Elasticsearch Master 节点的职责 由主节点负责ping 所有其他节点 判断是否有节点已经挂掉 创建或删除索引 决定分片在节点之间的分配 稳定的主节点对集群的健康是非常重要的 虽然主节点也可以协调节点 路由搜索和从客户端新
  • 6.84 C++ 遍历数组的几种方式

    1 计算出数组长度进行遍历 数组类型确定 数组中每个元素本身的字节大小就已经确定 利用 sizeof 函数可以计算出数组长度 而后利用 for 循序进行数组的遍历 2 使用类似 foreach 的方式进行遍历 C 中也可使用类似 forea
  • AVI文件与WAV文件格式

    AVI 与WAV文件都属于RIFF文件 因此都遵循RIFF文件的格式要求 先看看RIFF文件的格式 第一 RIFF 大小 AVI WAV 数据 第二 RIFF 文件中实际的数据通常采用列表 list 和块 Chunk 的形式表示 列表结构为
  • 智能门锁电路图_蓝牙门锁原理图一览 蓝牙智能门锁工作原理介绍

    蓝牙智能门锁工作原理是什么 蓝牙门锁原理图步骤详解 蓝牙智能门锁主要是通过手机开锁的方式来解锁 相比传统门锁 蓝牙门锁更加便捷 此外 还可以通过手机APP来实现门锁实时管理 访客管理 是符合智能家居时代对门锁要求的电子产品 那么蓝牙智能门锁
  • tesseract api C++使用例子

    转自 https code google com p tesseract ocr wiki APIExample APIExample API examples Updated Aug 12 2014 by theraysm gmail c
  • unsigned int 和 signed int 的区别

    unsigned int 和 signed int 的区别 对于 int 类型 默认是带有正负号的 也就是说 int 等同于 signed int signed int 等同于int 都能表示正负数 1 signed int 可以表示正整数
  • SQL优化之LIMIT语法, limit n,m 和 limit n有什么区别?

    在某些面试题中会遇到这样的问答或笔试题 limit 0 1 和 limit 1有什么区别 要准确回答这个问题就等深入明白limit一个参数和两个参数的本质区别 limit n m 中的第一次参数n表示的游标的偏移量 初始值为0 第二个参数m