Mysql分页:高效处理海量数据的核心技术

Mysql分页:高效处理海量数据的核心技术

在这里插入图片描述

01 引言

在Web应用、移动应用或数据分析场景中,数据库常常需要处理百万甚至千万级的数据记录。一次性加载所有数据不仅效率低下,还会消耗大量网络带宽和内存资源。数据库分页技术正是解决这一挑战的关键方案。

在日常开发中,对于列表页面的查询、全链路操作日志等,数据的结果集可以无限增大或者数据量本身很大的场景,我们常常会增加分页,以避免一次性全量加载带来的内存、IO的压力。

02 分页方式

为了测试需要,按照ID顺序插入了100万的数据。

下面是分页插件展示的效果:
在这里插入图片描述

2.1 LIMIT-OFFSET

脚本

-- 获取第3页(每页10条)
select * from user_info order by id asc LIMIT 10 OFFSET 20;

LIMIT后面跟的事查询的数据数量,而OFFSET后面跟的是数据偏移量,也就是要跳过的数据量。

结果
在这里插入图片描述

页数计算:

  • 第一页:1~10
  • 第二页:11~20
  • 第三页:21~30

这种分页的方式,小编之前是不知道的,在查线上问题的时候偶然看到一段代码块,就好奇的点进去看了看:

在这里插入图片描述

才发现原来这样也可以分页,真的是涨知识了。

2.2 LIMIT X,Y

limit x,y 是小编常用的分页方式,x指偏移量,同offset。而y则指需要查询的数量。

脚本

-- 获取第3页(每页10条)
select * from user_info order by id asc LIMIT 20, 10;

结果

在这里插入图片描述

这种方式可能是习惯了,用起来感觉更加顺手。

03 分页使用注意事项

查询的结果的分页用起来比较简单,但是使用不当的话就会出现与期望偏差的数据。

3.1 语法

语法很简单,需要LIMIT关键字。

  • LIMIT ${偏移量},${要显示的记录数}
  • LIMIT ${要显示的记录数} OFFEST ${偏移量}

两者任选其一。

3.2 执行顺序

分页一定是最后需要执行或者处理的,无论简单的脚本还是复杂的脚本都是在语句的结尾。

脚本

-- 聚合查询
select age, count(*) from user_info GROUP BY age HAVING age > 30 ORDER BY age LIMIT 20, 10;

结果

在这里插入图片描述

页数计算:

  • 第一页:31~40
  • 第二页:41~50
  • 第三页:51~60

3.3 单条数据的查询

在业务代码中,我们如何查询一条数据呢?Mapper的查询结果中,返回的结果是一个数据集,要查询一条数据我们一般都是取集合中的第一条。

例如:我们需要再数据库中找到一个18岁的女孩。

脚本

select * from user_info WHERE age=18 AND sex='女';

结果

在这里插入图片描述

伪代码

List<UserInfo> userList = userInfoService.selectByAgeAndSex(18, "女");
return CollectionUtils.isNotEmpty(userList) ? userList.get(0) : null;

乍一看代码似乎没有什么问题,结果是确实返回了一条。但是Mysql结果集有很多数据,需要加载到内存中甚至在微服务之间传输,这样的无疑增加了资源的消耗。

我们可以直接从数据库中只查一条数据就好了,没有必要都查出来。我们需要使用LIMIT的另一语法:

  • LIMIT 要返回的数据量LIMIT 1 :返回一条数据】
select * from user_info WHERE age=18 AND sex='女' LIMIT 1;

在这里插入图片描述

3.4 深分页问题

深分页是一个无聊的话题,但是确实面试的一个考察点。

select * from user_info LIMIT 800000,10;

这已经翻了8w页了,还要继续翻么?这就是所谓的深分页。谁会这么干!

当然了,这样的查询语句的效率是低下的,测试的数据比较简单耗时大概1084ms。如何去优化呢?

主要原因是没有使用到覆盖索引,此时为了得到完整记录就需要回表,而回表是随机磁盘IO,速度慢消耗大。

解决办法就是减少回表次数:

-- 根据ID自增特性
select * from user_info WHERE id > 800000 limit 10;-- 自关联,减少回表次数
select * from user_info u INNER JOIN (select id from user_info LIMIT 800000,10) uu ON uu.id=u.id;

从一定程度上可以提高响应速度,测试结果分别可以的达到758ms915ms

04 分页公式

4.1 总页数计算

分页需要我们来计算。首先我们需要知道总共有多少数据(count),每页多少数据(length),这样我们才能知道能分多少页(total)。

// 总页数total的计算公式
int total = (int) Math.floor((this.count * 1.0d) / this.length);
if (this.count % this.length != 0) {// 除不尽,需要页数+1this.total++;
}

注意:这里是Math.floor()向下取整,然后总记录数除不尽每页的数量,页数就是+1。

4.2 偏移量计算

偏移量的计算需要知道当前是多少页(current)了。

// 计算偏移量
int offset = (this.current - 1) * this.length;

4.3 分页的使用

  • 通过上面的公式自定义分页
  • 使用第三方的分页,如cn.hutool.db.PageResult

05 小结

我们习惯了三方库的分页,可能从来都没有自己去实现过分页或者封装都属于自己框架的分页,赶快去试试吧。

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

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

相关文章

通过 Docker 运行 Prometheus 入门

Promethues 组件 prometheus serverexporteralertmanager 环境准备 Docker 拉取镜像备用 # https://hub.docker.com/r/prom/prometheus docker pull m.daocloud.io/docker.io/prom/prometheus:main# https://hub.docker.com/r/prom/node-exporter docker pull m.daocloud.io/do…

Java 8特性(一)

目录 一、Lambda表达式 1、语法格式&#xff1a; &#xff08;1&#xff09;接口名 对象名(参数类型1参数名1,....参数类型n 参数名n)->{方法体;} &#xff08;2&#xff09;参数类型h 参数名n:接口中抽象方法的参数项 &#xff08;3&#xff09;->:表示连接操作 &a…

【代码随想录|232.用栈实现队列、225.用队列实现栈、20.有效的括号、1047.删除字符串中的所有相邻重复项】

232.用栈实现队列 timutimtit232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; class MyQueue { public:stack<int> Sin;stack<int> Sout;MyQueue() {}void push(int x) {Sin.push(x);}int pop() {if (Sout.empty()) { // 出栈为空就把入栈的数导出来w…

码上爬第三题【协程+浏览器调试检测】

前言&#xff1a;图灵第三题就是对用户浏览器调试检测&#xff0c;检测鼠标右击打开控制台&#xff0c;检测键盘按键ctrlshifti&#xff0c;从浏览器设置打开开发者工具也不行&#xff0c;应该是有浏览器宽高检测的&#xff0c;所以我们保证浏览器页面宽高不变即可。你如果想右…

windows、linux应急响应入侵排查

windows入侵排查 1.1检查账号 1.查看服务器是否有弱口令&#xff0c;远程管理端口是否对公网开放 2.查看服务器是否存在可疑账号、新增账号 检查方法&#xff1a;打开 cmd 窗口&#xff0c;输入 lusrmgr.msc 命令&#xff0c;查看是否有新增/可疑的账号&#xff0c;如有管…

11. 为什么要用static关键字

11. 为什么要用static关键字 static&#xff1a;通常来说&#xff1a;在new一个对象的时候&#xff0c;数据存储空间才会被分配&#xff0c;方法才能被外界使用。但是有时只想单独分配一个存储空间&#xff0c;不考虑需要创建对象或不创建对象&#xff0c;在没有对象的情况下也…

[Oracle] MAX()和MIN()函数

MAX() 和 MIN() 是 Oracle 常用的聚合函数&#xff0c;用于从一组值中找出最大值和最小值1.MAX()函数MAX()函数返回指定列或表达式中的最大值语法格式MAX(expression)参数说明expression&#xff1a;可以是列名、计算列或表达式示例-- 返回employees表中salary列的最大值 SELEC…

网络资源模板--基于Android Studio 实现的麻雀笔记App

目录 一、测试环境说明 二、项目简介 三、项目演示 四、部设计详情&#xff08;部分) 添加页面 五、项目源码 一、测试环境说明 电脑环境 Windows 11 编写语言 JAVA 开发软件 Android Studio (2020) 开发软件只要大于等于测试版本即可(近几年官网直接下载也可以)&…

96-基于Flask的酷狗音乐数据可视化分析系统

基于Flask的酷狗音乐数据可视化分析系统 &#x1f4cb; 目录 项目概述技术栈系统架构功能特性数据库设计核心代码实现数据可视化部署指南项目总结 &#x1f3af; 项目概述 本项目是一个基于Flask框架开发的酷狗音乐数据可视化分析系统&#xff0c;旨在为用户提供音乐数据的…

Java基础-红包雨游戏-多线程

目录 案例要求&#xff1a; 实现思路&#xff1a; 代码&#xff1a; Employee RedPacket RedPacketRain 总结&#xff1a; 案例要求&#xff1a; 实现思路&#xff1a; 创建一个员工类,id和抢到的金额&#xff0c;创建一个红包类&#xff0c;里面就是金额&#xff0c;创…

[激光原理与应用-203]:光学器件 - 增益晶体 - 增益晶体的使用方法

增益晶体是激光器的核心元件&#xff0c;其作用是通过受激辐射放大光信号。正确使用增益晶体需综合考虑晶体选型、光路设计、热管理、泵浦方式及安全防护等关键环节。以下是增益晶体的详细使用方法及注意事项&#xff1a;一、晶体选型&#xff1a;根据需求匹配参数材料选择Nd:Y…

​什么是抽象主义人工智能?​

什么是抽象主义人工智能&#xff1f; 传统的人工智能分为符号主义和连接主义两个派别&#xff0c;后来又增加了行为主义。 我发现符号主义和连接主义处理的都是文本&#xff0c;而不是语义。原来的专家系统是符号主义的产物。现在的大语言模型是连接主义的产物。它们处理的都…

OpenSpeedy绿色免费版下载,提升下载速度,网盘下载速度等游戏变速工具

下载地址获取点击这里打开&#xff1a;OpenSpeedy 简单介绍OpenSpeedy 是一款开源免费的游戏变速工具&#xff08;对某些网盘或者其他的一些下载也可进行加速&#xff09;&#xff0c;让你的游戏突破帧率限制&#xff0c;提供更流畅丝滑的游戏加速体验。1、完全免费且开源2、简…

Windows 电脑远程访问,ZeroTier 实现内网穿透完整指南(含原理讲解)

&#x1f9ed; 一、目标场景说明 想从安卓移动端远程到Windows电脑 实现如下效果&#xff1a; 家中 Windows 电脑开机联网&#xff1b;安卓手机/平板在外地&#xff0c;只要联网就能远程控制电脑桌面&#xff1b;不需要公网 IP&#xff0c;不用设置端口映射&#xff1b;免费…

解决本地连接服务器ollama的错误

1. 服务器 ollama 安装 $ curl -fsSL https://ollama.com/install.sh | sh >>> Cleaning up old version at /usr/local/lib/ollama >>> Installing ollama to /usr/local >>> Downloading Linux amd64 bundle ##################################…

详解Windows(十四)——PowerShell与命令提示符

详解Windows&#xff08;十四&#xff09;——PowerShell与命令提示符 一、Windows命令行工具概述 1. 什么是命令行界面(CLI) 命令行界面&#xff0c;简称CLI&#xff08;Command Line Interface&#xff09;&#xff0c;是一种通过输入文字命令来操作电脑的方式。与我们熟悉…

Spring源码解析 - SpringApplication 属性-初始化initializers, listeners -Spring提供的钩子函数

初始化源码 public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {~~~setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));setListeners((Collection) getSpringFactoriesInstances(A…

简单聊聊PowerShell

1、powershell和cmdpowershell简单来说也是一个控制终端&#xff0c;他也经常拿出来和windows自带的CMD来进行对比。windows系统一般来说这两者都是自带的。虽然cmd平时大家用的最多&#xff0c;但他是非常古老的&#xff0c;可以用来执行简单的批处理文件&#xff0c;如.bat等…

Spring系列之Spring AI入门

概述 GitHub&#xff0c;官网&#xff0c;目前最新版是1.0.1。 功能&#xff1a; 跨AI提供商的可移植API&#xff1a;用于聊天、文本到图像和嵌入模型。支持同步和流API选项。还支持下拉访问模型特定功能。跨Vector Store提供商的可移植API&#xff0c;包括同样可移植的新颖…

ELK常见的问题

ELK 栈在使用过程中会遇到各种问题&#xff0c;以下是常见问题分类及解决方案&#xff0c;涵盖 ​Elasticsearch、Logstash、Kibana 和 Beats&#xff08;如 Filebeat&#xff09;​​ 四大组件&#xff1a; &#x1f6a8; ​一、连接与通信问题​ 1. ​Elasticsearch 拒绝连接…