数据库监控与调优【十三】—— LIMIT语句优化

LIMIT语句优化

LIMIT语句使用规则

  • limit<offset>, <size>
    • offset:返回结果第一行的偏移量(想要跳过多少行)
    • size:指定返回多少条

举例说明

-- 查询第1页时,花费92ms
SELECT * FROM employees LIMIT 0, 10;-- 查询第300001页时,花费174ms
SELECT * FROM employees LIMIT 300000, 10;

发现问题

可以看到offset越大,花费的时间就越长

使用EXPLAIN分析

EXPLAIN SELECT * FROM employees LIMIT 300000, 10;

在这里插入图片描述

可以看到type是ALL,表示全表扫描,会先扫描300000行数据,再丢弃,之后再取10行。

所以针对offset非常大的情况,就需要做一系列的分页优化

方案一

-- 方案一:覆盖索引,花费108mms
SELECT emp_no FROM employees LIMIT 300000, 10;

使用EXPLAIN分析

EXPLAIN SELECT emp_no FROM employees LIMIT 300000, 10;

在这里插入图片描述

可以看到type是index,表示全索引扫描,和ALL类似,只不过index是全盘扫描了索引的数据。index较ALL提升还是很大的

如果我们确实需要返回所有行,怎么办?可以见下面几种方案

方案二

-- 方案二:覆盖索引+join,花费109ms
SELECT * FROM employees e INNER JOIN (SELECT emp_no FROM employees LIMIT 300000, 10) t ON e.emp_no = t.emp_no;
-- 或
SELECT * FROM employees e INNER JOIN (SELECT emp_no FROM employees LIMIT 300000, 10) t USING(emp_no);

方案三

-- 方案三:覆盖索引+子查询,花费126ms
SELECT * FROM employees WHERE emp_no >= (SELECT emp_no FROM employees LIMIT 300000, 1) LIMIT 10;

方案四

-- 方案四:范围查询+limit语句
SELECT * FROM employees LIMIT 0, 10;
SELECT * FROM employees WHERE emp_no > 10010 LIMIT 10;
-- ...
SELECT * FROM employees WHERE emp_no > 499975 LIMIT 10;

这样的好处是,不管查询第几页的结果,需要扫描的行数永远都是10行

但是这种方案的前提是,需要拿到上一页的主键最大值,否则这个方案无法实施

方案五

-- 方案五:如果能获得起始主键值和结束主键值
SELECT * FROM employees WHERE emp_no BETWEEN 499976 AND 499985;

方案六

禁止传入过大页码

可以参考百度,例如:https://www.baidu.com/s?wd=a&pn=60&oq=a&ie=utf-8&usm=2&rsv_pq=d46785140005b625&rsv_t=1dd0FWJWTyx3Z%2FiNoz3FWYTNvGJ1i2haq1J1%2BhWFGJRhPGzLWhtJYC7GWnM这是查询a这个关键字第7页的url,pn与页码相关,如果pn=990代表查询第100页的数据,通过搜索发现无法查询,跳转到第1页。如果pn=750代表查询第76页的数据,通过搜索发现最大页码为76

假设百度是使用mysql,每页展示10条,最多展示76页,这个偏移量offset最大才750,此时sql随便写不需要优化。

而且,百度这种方式,大部分情况下还是比较合理的,因为很少有人查询某个内容需要到特别靠后的页,76页完全够用。

总结

以上方案全都可以用到生产中,如果查询字段能覆盖需求字段,则优先方案一,方案二和方案三为业界最广泛的解决方案。方案四和方案五是针对能获取到起始主键值和结束主键值。方案六则告诉我们sql写得再好不如从业务角度着手

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

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

相关文章

【容灾系统搭建】网络杂谈(1)之容灾系统如何搭建?

涉及知识点 什么是容灾&#xff0c;容灾系统的建设&#xff0c;容灾系统的结构模型&#xff0c;容灾平台。深入了解容灾技术。 原创于&#xff1a;CSDN博主-《拄杖盲学轻声码》&#xff0c;更多内容可去其主页关注下哈&#xff0c;不胜感激 文章目录 涉及知识点前言1.容灾系统…

ElasticSearch的核心概念简单描述

我正在参加「掘金启航计划」 ES核心概念 ES是面向文档,下面表格是和关系型数据库的对比,一切都是JSON 关系数据库(Mysql)ES数据库(database)索引(indices) 和数据库一样表(tables)types 慢慢会被弃用 7.0已经过时 8.0会彻底废弃行(rows)documents (数据)文档字段(columns)fi…

Navicat连接oracle

1、官网下载oracle instant client客户端&#xff08;版本自选&#xff09; Oracle Instant Client Downloads 下载后解压 2、navicat配置 在工具-> 选项 -> OCI 或环境中&#xff0c;选择在步骤 1 解压目录的 oci.dll 3、重新启动 Navicat 4、配置oracle连接即可 参考…

别再分库分表了,试试TiDB!

什么是NewSQL 传统SQL的问题 升级服务器硬件 数据分片 NoSQL 的问题 优点 缺点 NewSQL 特性 NewSQL 的主要特性 三种SQL的对比 TiDB怎么来的 TiDB社区版和企业版 TIDB核心特性 水平弹性扩展 分布式事务支持 金融级高可用 实时 HTAP 云原生的分布式数据库 高度兼…

工程安全监测无线振弦采集仪在建筑物的应用分析

工程安全监测无线振弦采集仪在建筑物的应用 工程安全监测无线振弦采集仪是一种在建筑物中应用的重要设备。它通过无线采集建筑物内部的振动信息&#xff0c;对建筑物的安全性进行监测和评估&#xff0c;为建筑物的施工和使用提供了可靠的技术支持。本文将详细介绍工程安全监测…

【GESP】2023年06月图形化一级 -- 去旅行

文章目录 去旅行1. 准备工作2. 功能实现3. 设计思路与实现&#xff08;1&#xff09;角色、舞台背景设置a. 角色设置b. 舞台背景设置 &#xff08;2&#xff09;脚本编写a. 角色&#xff1a;Avery Walking 4. 评分标准 去旅行 1. 准备工作 &#xff08;1&#xff09;删除默认小…

golang,OpenGL,计算机图形学(三)

代码仓库 https://github.com/phprao/go-graphic 颜色 光源照射到物体上&#xff0c;一部分颜色被吸收&#xff0c;另一部分无法吸收的被反射到人眼&#xff0c;于是呈现出了颜色。 当我们把光源的颜色与物体的颜色值相乘&#xff08;而不是点乘&#xff09;&#xff0c;所…

同城跑腿独立版小程序 码科跑腿小程序 支持用户端 骑手端

是独立版哦&#xff0c;不是微擎的 搭建有点复杂&#xff0c;只要一步错就会导致骑手端来单没有声音提示. 多的也不介绍了&#xff0c;不知道的朋友可以百度一下码科跑腿就知道了&#xff01;

大数据的金融数据读取及分析(-)

由于考虑商业数据问题&#xff0c;我们用开源数据做演示 一.tushare开源数据 Tushare是一个免费、开源的python财经数据接口包。主要实现对股票等金融数据从数据采集、清洗加工到数据存储的过程&#xff0c;能够为金融分析人员提供快速、整洁、和多样的便于分析的数据&#x…

Tomcat与Undertow容器性能对比分析

&#x1f468;‍&#x1f393;作者&#xff1a;bug菌 ✏️博客&#xff1a; CSDN、 掘金、 infoQ、 51CTO等 &#x1f389;简介&#xff1a;CSDN博客专家&#xff0c;C站历届博客之星Top50&#xff0c;掘金/InfoQ/51CTO等社区优质创作者&#xff0c;全网合计8w粉&#xff0c;对…

【已解决】ModuleNotFoundError: No module named ‘timm.models.layers.helpers‘

文章目录 错误信息原因解决方法专栏&#xff1a;神经网络精讲与实战AlexNetVGGNetGoogLeNetInception V2——V4ResNetDenseNet 错误信息 在使用timm库的时候出现了ModuleNotFoundError: No module named timm.models.layers.helpers’的错误&#xff0c;详情如下&#xff1a; …

旧手机不要轻易扔掉,将其设置为无线网卡,不消耗流量

如果你有一部旧手机正在闲置着&#xff0c;或者正考虑要将其丢弃&#xff0c;那么请暂停一下。因为这个旧手机可以成为你的无线网卡&#xff0c;帮助你在家中或出行时实现更快的网络下载速度&#xff0c;而且毫不费流量。接下来&#xff0c;我将告诉你如何将旧手机变成无线网卡…