Limit分页遇到百万级数据该何去何从

一、Limit分页基础

mysql使用查询语句的时候,经常要返回前几条或者中间某几行数据,也就是我们说的分页,语法如下:

SELECT * FROM table LIMIT offset,length

LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。具体详情可参考: 理解SpringBoot中的分页竟然如何简单

二、性能分析

1. 案例分析

select * from student limit offset,length

当起始页较小时,查询没有性能问题,我们分别看下从10, 100, 1000,10000,400000,800000开始分页的执行时间(每页取20条)

select * from student limit 10, 20   0.016select * from student limit 100, 20   0.016select * from student limit 1000, 20   0.047select * from student limit 10000, 20   0.094select * from student limit 400000, 20   3.229select * from student  limit 866613, 20   37.44

可以看出随着起始记录的增加,时间也随着增大, 这说明分页语句limit跟记录行的**偏移量(起始页码)**是有很大关系的。

LIMIT 100000, 20 的意思是扫描满足条件的 100001 行,然后扔掉前 100000 行

MySQL 耗费了 大量随机 I/O 在回表查询聚簇索引的数据上,而这 100000 次随机 I/O 查询数据不会出现在结果集中。

像这种分页最大的页码页显然这种时间是无法忍受的。从中我们也能总结出两件事情:

  • limit语句的查询时间与起始记录的位置成正比
  • mysqllimit语句是很方便,但是对记录很多的表并不适合直接使用。

2. 优化方法

利用了索引查询的语句中如果只包含了那个索引列(覆盖索引),那么这种情况会查询很快。在上述例子中,我们知道id字段是主键,自然就包含了默认的主键索引。利用覆盖索引的对查询效果进行测试。

查询最后一页的数据(利用覆盖索引,只包含id列),如下

select id from table limit 866613, 20    0.2

相对于查询了所有列的37.44秒,提升了大概100多倍的速度

那么如果我们也要查询所有列,有两种方法,一种是id>=的形式,另一种就是利用join,看下实际情况:

//使用id> =
SELECT * FROM table WHERE ID > = 866613 limit 20;

类似于查询 SELECT * FROM table WHERE id > 866613 LIMIT 20; 这样的效率非常快,因为主键上是有索引的,但是这样有个缺点,就是id必须是连续的,并且查询不能有WHERE语句,因为WHERE语句会造成过滤数据。

//使用JOIN的方式
SELECT * FROM table a JOIN (select id from table limit 866613, 20) b ON a.id = b.id

MySQL的查询完全命中索引的时候,称为覆盖索引,是非常快的,因为查询只需要在索引上进行查找,之后可以直接返回,而不用再回数据表拿数据。因此我们可以先查出索引的 id,然后根据 id 拿数据。

这2种写法的查询时间都很短,大概0.2s左右


参考文章:https://blog.csdn.net/weixin_37598682/article/details/94547518

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

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

相关文章

TCP详解之滑动窗口

TCP详解之滑动窗口 引入窗口概念的原因 我们都知道 TCP 是每发送一个数据,都要进行一次确认应答。当上一个数据包收到了应答了, 再发送下一个。 这个模式就有点像我和你面对面聊天,你一句我一句。但这种方式的缺点是效率比较低的。 如果你…

git中无法使用方向键的问题

windows下使用git命令行执行react脚本安装,发现无法使用上下键来去选中选项。最后只能换成cmd命令执行,发现可以上下移动以选中需要的选项。 bash命令行:移动光标无法移动选项 cmd命令行

算法宝典1——Java版本(此系列持续更新,这篇文章有20道)(有题目的跳转链接)(此份宝典包含了链表、栈、队列、二叉树的算法题)

注:由于字数的限制,我打算把算法宝典做成一个系列,一篇文章就20题!!! 目录 一、链表的算法题(目前10道) 1. 移除链表元素(力扣;思路:前后指针&…

Linux-Nginx安装

一、Nginx下载 官网下载地址: https://nginx.org/en/download.html 国内镜像地址: https://mirrors.huaweicloud.com/nginx 二、Nginx安装 1. 将下载的Nginx安装包上传到Linux服务器指定安装盘符下,解压zip包 tar -zxvf nginx-1.23.3.ta…

【PHP】麻醉临床信息系统

麻醉临床信息系统以服务围术期临床业务工作的开展为核心,为医护人员、业务管理人员、院级领导提供流程化、信息化、自动化、智能化的临床业务综合管理平台。 麻醉信息系统处理的数据包含病人的手术信息、麻醉信息、病人手术过程中从监护仪上采集到的数据和病人情况等…

【嵌入式】2024届校招岗位汇总

公司岗位博世嵌入式自动化测试工程师博世嵌入式开发(软件刷写及启动)工程师博世Linux/C软件工程师博世自动驾驶软件开发工程师博世嵌入式软件工程师(BSP)博世嵌入式电子工程师 (BMS&电源)博世物联网嵌入式开发工程师 &#xf…

vue3-vant4-vite-pinia-axios-less学习日记

代码地址 GitHub:vue3-vant4-vite-pinia-axios-less 效果如图 1.首页为导航栏 2.绑定英雄页 3.注册页 4.英雄列表页 5.后面不截图了,没啥了 模块 1.vant4:按需引入组件样式文档 2.安装该vite-plugin-vue-setup-extend插件可以直接在…

数据结构与算法(一)

文章目录 数据结构与算法(一)1 位运算、算法是什么、简单排序1.1 实现打印一个整数的二进制1.2 给定一个参数N,返回1!+2!+3!+4!+...+N!的结果1.3 简单排序算法2 数据结构大分类、前缀和、对数器2.1 实现前缀和数组2.2 如何用1\~5的随机函数加工出1\~7的随机函数2.3 如何把不…

C++学习笔记--项目知识点集合

一、同步IO、异步IO、阻塞IO、非阻塞IO 首先来看看两种I/O的定义:同步I/O和异步I/O 同步(阻塞)I/O:在一个线程中,CPU执行代码的速度极快,然而,一旦遇到IO操作,如读写文件、发送网络…

vue+electron一键入门

前言 帮公司弄了一个vueelectron项目,里面用到了axios、element-ui、ue-router、js-md5、sqlite3这些依赖库,其中sqlite3比较难搞下面会详细展开来讲,同时也涉及打包(window包、mac包) 开始 其实项目整体没啥好讲&a…

Linux安装logstash

相关链接 项⽬主⻚: https://www.elastic.co/cn/downloads/logstash 下载地址: wget https://artifacts.elastic.co/downloads/logstash/logstash-7.5.1.tar.gz 官网下载可能比较慢,下面提供下载地址 百度云链接:https://pan.…

[golang 流媒体在线直播系统] 4.真实RTMP推流摄像头把摄像头拍摄的信息发送到腾讯云流媒体服务器实现直播

用RTMP推流摄像头把摄像头拍摄的信息发送到腾讯云流媒体服务器实现直播,该功能适用范围广,比如:幼儿园直播、农场视频直播, 一.准备工作 要实现上面的功能,需要准备如下设备: 推流摄像机(监控) 流媒体直播服务器(腾讯云流媒体服务器,自己搭建的流媒体服务…

【LeetCode-简单题】541. 反转字符串 II

文章目录 题目方法一:双指针 题目 方法一:双指针 题目的意思: 通俗一点说,每隔k个反转k个,末尾不够k个时全部反转; 需要注意右边界的取值 int r Math.min(l k -1,n-1);//取右边界与n-1的最小值 确定边界…

第28节-PhotoShop基础课程-图层操作

文章目录 前言1.像素图层2.删除 Delete3.合并 Ctrl E4.盖印 Ctrl Shift Alt5.图层顺序-拖动就可以6.编组-Ctrl G 管理图层-分类存放7.锁定图层-背景图层8.不透明度9.查找图层 2.智能图层1.能保持图片放大缩小(Ctrl T)的时候不丢失分辨率2.和滤镜配合使…

Java手写哈希集合和案例拓展

Java手写哈希集合和案例拓展 1. 思维导图 #mermaid-svg-hx4PFS8HX0SmLwDA {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hx4PFS8HX0SmLwDA .error-icon{fill:#552222;}#mermaid-svg-hx4PFS8HX0SmLwDA .error-text…

Prometheus 基础入门

一.Prometheus Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB)。Prometheus使用Go语言开发,是Google BorgMon监控系统的开源版本。2016年由Google发起Linux基金会旗下的原生云基金会(Cloud Native Computing Foundation), 将Prometheus纳入其下第二大开…

Linux学习第18天:Linux并发与竞争: 没有规矩不成方圆

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 提到锁”,可能想到的更多的是限制。现实中,生活中锁也 存在于身边的方方面面。正所谓没有规矩不成方圆, 没有身边的这些锁&…

vue 引入zTree

下载js包解压后找个地方放文件夹内 引入 import "/common/zTree/js/jquery-1.4.4.min" import "/common/zTree/js/jquery.ztree.core.min.js" import "/common/zTree/js/jquery.ztree.excheck.min.js" import "/common/zTree/css/metroSt…

《TCP/IP网络编程》阅读笔记--epoll的使用

1--epoll的优点 select()的缺点: ① 调用 select() 函数后针对所有文件描述符的循环语句; ② 调用 select() 函数时需要向操作系统传递监视对象信息; epoll()的优点: ① 无需编写以监视状态变化为目的的针对所有文件描述符的循环语…

webpack 基础配置

常见配置 文件打包的出口和入口webpack如何开启一台服务webpack 如何打包图片,静态资源等。webpack 配置 loader配置 plugin配置sourceMap配置 babel 语法降级等 接下来 , 我们先从webpack的基本配置 开始吧! 在准备 配置之前 , 搭建一个 …