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 的实现, 以及 为什么越到后面的页数 开销越大

遍历的记录
这里我们主要 几个 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 条

遍历的记录如下, 按照主键索引, 依次找的 0 – 10 条
select * from tz_test limit 100, 10;
查询结果如下, 可以看到查询的是 主键索引
然后 按照主键排序, 找的 100 – 110 条

遍历的记录如下, 按照主键索引, 依次找的 100 – 110 条
select * from tz_test limit 1000, 10;
查询结果如下, 可以看到查询的是 主键索引
然后 按照主键排序, 找的 1000 – 1010 条

遍历的记录如下, 按照主键索引, 依次找的 1000 – 1010 条
limit 的实现
explain 以下如下, 可以发现 只要携带的有 limit 基本上都是走 全表扫描, 或者 索引的全部扫描
只是相比于 全表扫描, 索引记录较小, 记录遍历, 记录复制, 以及页面开销 较小
field1 无索引, 仅仅只有 主键索引的情况

field1 增加索引之后

limit $offset, $limit 的过滤
所以 limit 查询会遍历数据表中符合条件的前 ($offset + $limit) 条数据, 然后 之后跳出循环
如下地方是 基于 offset 的过滤
这里的 unit->offset_limit_cnt 就是 $offset 的值, 会先过滤掉 前面 $offset 条符合条件的数据

$limit 结束的限定在这里, 如果发送的数据量 到达期望的数据量, 跳出循环
limit 的优化?
假设 $offset 接近于 $count
然后 没有反方向查询的优化
假设执行 sql 如下 “select * from tz_test limit 9999852, 10;”, 可以看到 依然是根据 主键从小到大依次遍历

假设 $offset 大于 $count
假设执行 sql 如下 “select * from tz_test limit 19999852, 10;”
$offset 是一个 大于当前表记录数量的数字, 可以看出 依然进行了一次 全表扫描

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 个 全新 节点组成ÿ…...
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 你知道吗ÿ…...
【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这个神器,才发现原来配置以太网外设可以像搭积木一样简单…...
