当前位置: 首页 > news >正文

34 mysql limit 的实现

前言

这里来看一下 我们常见的 mysql 分页的 limit 的相的处理

这个问题的主要是来自于 之前有一个需要处理 大数据量的数据表的信息, 将数据转移到 es 中

然后就是用了最简单的 “select * from tz_test limit $pageOffset, $pageSize ” 来分页处理 

但是由于 数据表的数据量较大, 越到后面的分页, 该页的查询 耗时越大

然后 后面调整了一下 实现思路, 将 mysql 的数据先放到 kafka,  然后基于 kafka 来进行遍历, 然后处理, 然后入库 

 

tz_test 表结构如下 

CREATE TABLE `tz_test` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`field1` varchar(128) DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=10000000 DEFAULT CHARSET=utf8

 

然后 往该数据表中写入 1000_0000 条记录信息  

然后 我们来看一下 具体的 limit 的实现, 以及 为什么越到后面的页数 开销越大

3869976fcfd64523840eacd747d5c8c7.png

 

 

遍历的记录

这里我们主要 几个 sql 来进行调试  

然后 从以下的这些信息中, 可以看到 为什么越到后面的分页, 查询所需要的开销越大 

select * from tz_test limit 10;
select * from tz_test limit 100, 10;
select * from tz_test limit 1000, 10;

 

select * from tz_test limit 10;

查询结果如下, 可以看到查询的是 主键索引

然后 按照主键排序, 找的 0 – 10 条 

a572056da2ca4f7bac2ebbdb4c726a68.png

 

遍历的记录如下, 按照主键索引, 依次找的 0 – 10 条 

31e3d2702d5a44eaae33a6f47b36713e.png 

 

 

select * from tz_test limit 100, 10;

查询结果如下, 可以看到查询的是 主键索引

然后 按照主键排序, 找的 100 – 110 条 

9ac02defe69a487884c76c97c6bf6f86.png

 

遍历的记录如下, 按照主键索引, 依次找的 100 – 110 条 

6641ee0779b14a7f9043da0140307f64.png 

 

 

select * from tz_test limit 1000, 10;

查询结果如下, 可以看到查询的是 主键索引

然后 按照主键排序, 找的 1000 – 1010 条 

9b84c89807844fe2b9124f8cd912fb5f.png

 

遍历的记录如下, 按照主键索引, 依次找的 1000 – 1010 条 

69180cbbfade4d05a74183c68fddc095.png 

 

 

limit 的实现

explain 以下如下, 可以发现 只要携带的有 limit 基本上都是走 全表扫描, 或者 索引的全部扫描

只是相比于 全表扫描, 索引记录较小, 记录遍历, 记录复制, 以及页面开销 较小

field1 无索引, 仅仅只有 主键索引的情况

f520a6d746064df084305ec032c70ee1.png

 

field1 增加索引之后 

8282619f9e1d4508b7b553713eefcc46.png

 

limit $offset, $limit 的过滤 

所以 limit 查询会遍历数据表中符合条件的前 ($offset + $limit) 条数据, 然后 之后跳出循环

如下地方是 基于 offset 的过滤 

这里的 unit->offset_limit_cnt 就是 $offset 的值, 会先过滤掉 前面 $offset 条符合条件的数据 

76dd22bff76d4b248db200502d140e40.png

 

$limit 结束的限定在这里, 如果发送的数据量 到达期望的数据量, 跳出循环 

20ed11514cb34975a0a604e8a7f8c0d9.png 

 

limit 的优化? 

 

假设 $offset 接近于 $count

然后 没有反方向查询的优化 

假设执行 sql 如下 “select * from tz_test limit 9999852, 10;”, 可以看到 依然是根据 主键从小到大依次遍历

e5a137edebcd4949b98b16e3e2a58ba2.png

 

 

假设 $offset  $count 

假设执行 sql 如下 “select * from tz_test limit 19999852, 10;”

$offset 是一个 大于当前表记录数量的数字, 可以看出 依然进行了一次 全表扫描

cb0eaeba9fbd40349d9aaa51feb10f6b.png

 

 

limit $offset, $limit 转换 为条件查询  

假设 “select * from tz_test” 走的是 主键索引 

如下 sql 可以转换为 “select * from tz_test limit 9990000, 10;”

根据 id 的条件查询 “select * from tz_test where id > 9990138 limit 10;”

“9990138” 为上一个分页的最大的 id 的字段信息, 这里会现根据 主键索引定位到目标记录, 然后再往后 迭代 10 条记录 

 

 

假设 “select * from tz_test” 走的是 field1索引 

如下 sql 可以转换为 “select * from tz_test limit 9990000, 10;”

根据 field1 的条件查询 “select * from tz_test where field1 >= ‘9990138’ and id > 9990138 limit 10;”

“9990138” 为上一个分页的最大的 field1 的字段信息, 这里会现根据 field1索引定位到目标记录, 然后再往后 迭代 10 条记录 

 

 

 

 

 

相关文章:

34 mysql limit 的实现

前言 这里来看一下 我们常见的 mysql 分页的 limit 的相的处理 这个问题的主要是来自于 之前有一个需要处理 大数据量的数据表的信息, 将数据转移到 es 中 然后就是用了最简单的 “select * from tz_test limit $pageOffset, $pageSize ” 来分页处理 但是由于 数据表的数…...

jbase实现申明式事务

对有反射的语言,申明式事务肯定不可少。没必要没个人都try,catch写事务,写的不好的话还经常容易锁表,为此给框架引入申明式事务。申明式既字面意思,在需要事务的方法前面加一个申明,那么框架保证事务。 首…...

如何在在线Excel文档中规范单元格输入

在日常的工作中,我们常常需要处理大量的数据。为了确保数据的准确性和可靠性。我们需要对输入的数据进行规范化和验证。其中一个重要的方面是规范单元格输入。而数据验证作为Excel中一种非常实用的功能,它可以帮助用户规范单元格的输入,从而提…...

力扣138:随机链表的复制

力扣138:随机链表的复制 题目描述: 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff…...

C语言左移与右移学习

在学习左移与右移之前,我们首先要学习两种移位运算:逻辑移位和算数移位。 逻辑位移:移出去的位丢弃,空缺位用0补充。 算数位移:移出去的位丢弃,空缺位用符号位补充。 左移 左移是高位溢出,低…...

asp.net core mvc之 视图

一、在控制器中找到匹配视图,然后渲染成 HTML 代码返回给用户 public class HomeController : Controller {public IActionResult Index(){return View(); //默认找 Views/Home/Index.cshtml ,呈现给用户} } 二、指定视图 1、控制器 publ…...

ChatGLM3 tool_registry.py 代码解析

ChatGLM3 tool_registry.py 代码解析 0. 背景1. tool_registry.py 0. 背景 学习 ChatGLM3 的项目内容,过程中使用 AI 代码工具,对代码进行解释,帮助自己快速理解代码。这篇文章记录 ChatGLM3 tool_registry.py 的代码解析内容。 1. tool_re…...

js实现定时刷新,并设置定时器上限

定时器 在js中,有两种定时器: 倒计时定时器 倒计时定时器,也叫延时定时器或一次性定时器 功能:倒计时多长时间后执行某个动作 语法:setTimeout(function, timeout); 返回值:int类型,当前定时器…...

常用Linux命令

df -h #查看磁盘 kill -9 pid #强制关闭程序 ifconfig #查看网卡信息 last …...

【C++】获取指定点所在屏幕的尺寸

问题 多个显示器时,获取指定点所在的显示器的尺寸。 分析 之前整理过获取屏幕尺寸的方法:https://blog.csdn.net/m0_43605481/article/details/125024500多显示器时,需要用到GetSystemMetrics、EnumDisplayDevices、EnumDisplaySettings函…...

软文发布如何选择对应的媒体

企业做软文推广第一步,就是选择合适的媒体进行投放,然而许多企业不知道如何选择合适的媒体导致推广工作十分被动,无法取得效果,今天媒介盒子就来和大家分享,企业应该如何选择对应的媒体。 一、 媒体类型 根据软文类型…...

Django如何创建表关系,Django的请求声明周期流程图

【1】表与表之间的关系 一对一 左表的一条记录对应右表的一条记录,反之亦然 多对一 左表的一条记录对应右表的多条记录,反之不成立 多对多 左表的一条记录对应右表的多表记录,反之成立 【2】django中创建表关系 class Book(models.Model):t…...

微服务-我对Spring Clound的理解

官网:https://spring.io/projects/spring-cloud 官方说法:Spring Cloud 为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理、服务发现、熔断器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话…...

安防监控EasyCVR视频汇聚平台无法接入Ehome5.0是什么原因?该如何解决?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。安防平台EasyCVR拓展性强,视频能力丰富,具体可实现视频监控直播、视频轮播、视频录像、云存储、回放…...

机器学习——逻辑回归

目录 一、分类问题 监督学习的最主要类型 二分类 多分类 二、Sigmoid函数 三、逻辑回归求解 代价函数推导过程(极大似然估计): 交叉熵损失函数 逻辑回归的代价函数 代价函数最小化——梯度下降: ​编辑 正则化 四、逻辑…...

自动驾驶学习笔记(七)——感知融合

#Apollo开发者# 学习课程的传送门如下,当您也准备学习自动驾驶时,可以和我一同前往: 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo Beta宣讲和线下沙龙》免费报名—>传送门 文章目录 前言 感知融合 卡尔曼滤波 融合策略 实…...

【Java0基础学Java第八颗】 -- 继承与多态 -- 多态

8.继承与多态 8.2 多态8.2.1 多态的概念8.2.2 多态实现条件8.2.3 重写8.2.4 向上转型和向下转型8.2.5 向下转型8.2.6 多态的优缺点8.2.7 避免在构造方法中调用重写的方法 8.2 多态 8.2.1 多态的概念 通俗来说就是多种形态,具体点就是去完成某个行为,当…...

玩转ansible之参数调试和文件操作篇

更多IT技术文章,欢迎关注微信公众号“运维之美” 玩转ansible之参数调试和文件操作篇 01 剧本调试和帮助02 使用场景举例 上节我们学习了使用ansible进行软件安装,那么安装完软件后,就需要linux系统和软件配置修改了,对于linux主机…...

JVM虚拟机:垃圾回收器之Parallel Old(老年代)

本文重点 本文将学习老年代的另外一种垃圾回收器Parallel Old(PO),这是一种用于老年代的并行化垃圾回收器,它使用标记整理算法进行垃圾回收。 历史 在1.6之前,新生代使用Parallel Scavenge只能搭配老年代的Serial Old收集器,而…...

Stream流的groupingBy

Stream流的groupingBy 简单使用 业务场景:现在有100个人,这些人都年龄分部在18-30岁之间。现要求把他们按照年龄进行分组 key:年龄 value:数据列表 public void listToMapGroup() {//这里假设通过listStreamService.list();方法…...

Jupyter Notebook代码补全插件安装踩坑实录:从nbextensions不显示到完美解决(Anaconda环境)

Jupyter Notebook代码补全插件安装踩坑实录:从nbextensions不显示到完美解决(Anaconda环境) 在数据科学和机器学习的工作流中,Jupyter Notebook因其交互式特性广受欢迎,而代码补全功能能显著提升开发效率。然而&#x…...

Zotero中文文献管理终极指南:Jasminum插件完整教程

Zotero中文文献管理终极指南:Jasminum插件完整教程 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件,用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 你知道吗&#xff…...

【SITS2026官方性能白皮书精要】:AI模型推理延迟降低47%的7个硬核优化路径

SITS2026分享:AI性能优化建议 第一章:SITS2026白皮书核心结论与基准测试全景 2026奇点智能技术大会(https://ml-summit.org) 白皮书核心主张 SITS2026白皮书首次确立“语义-时序-空间”三重对齐(STS Alignment)为新一代智能系统…...

数字IC设计中的TCL实战:用列表操作实现引脚自动排序

数字IC设计中的TCL实战:用列表操作实现引脚自动排序 在数字集成电路设计流程中,处理海量引脚信息是每位工程师的日常挑战。当面对数百个需要按特定规则排序的引脚时,手动操作不仅效率低下,还容易引入人为错误。TCL脚本作为EDA工具…...

CnOpenData A股上市公司股权激励公告数据

根据2007年1月30日证监会令第40号公布的《上市公司信息披露管理办法》,为规范发行人、上市公司及其他信息披露义务人的信息披露行为,上市公司应当及时、准确、完整地披露相关信息,包括招股说明书、募集说明书、上市公告书、定期报告和临时报告…...

计算机算法的生命周期的庖丁解牛

它的本质是:算法并非静态的代码片段,而是一个在 时间(CPU 周期) 和 空间(内存/存储) 维度上展开的动态物理过程。它经历了从“抽象逻辑”到“离散指令”,再到“硅片电信号”,最终回归…...

保姆级教程:用Charades数据集复现行为识别模型(附PyTorch代码与避坑指南)

从零构建Charades行为识别模型:PyTorch实战与调优全攻略 在计算机视觉领域,行为识别一直是极具挑战性的研究方向。不同于静态图像分类,视频行为识别需要模型理解时间维度的信息变化,这对算法设计和工程实现都提出了更高要求。Char…...

5个高效方案:用NavMeshPlus实现Unity 2D智能导航的完整实践

5个高效方案:用NavMeshPlus实现Unity 2D智能导航的完整实践 【免费下载链接】NavMeshPlus Unity NavMesh 2D Pathfinding 项目地址: https://gitcode.com/gh_mirrors/na/NavMeshPlus NavMeshPlus作为Unity NavMesh系统的2D增强插件,为游戏开发者提…...

MATLAB 2020b 中文版安装避坑指南:断网、杀软、中文路径,一个都不能错

MATLAB 2020b 中文版安装避坑指南:断网、杀软、中文路径,一个都不能错 每次打开MATLAB都卡在启动界面?安装进度条走到99%就再也不动了?这些让人抓狂的问题,很可能是因为忽略了几个关键安装细节。作为一款功能强大的数学…...

告别手动配置:用STM32CubeMX快速搞定STM32F407的DP83848以太网与LWIP初始化(附常见Ping不通问题排查)

STM32F407以太网开发实战:基于CubeMX与DP83848的LWIP快速部署指南 第一次接触STM32F407的以太网开发时,我被数据手册里密密麻麻的寄存器配置和PHY芯片初始化流程吓到了。直到发现CubeMX这个神器,才发现原来配置以太网外设可以像搭积木一样简单…...