当前位置: 首页 > 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();方法…...

Data for AI:取之有度,用之有节!从Harness视角破解Agent应用Token爆炸难题

OpenClaw的流行与Token爆炸OpenClaw的流行最近大家见面免不了都要问一句:你养龙虾了吗?这里的“龙虾”,指的正是近期爆火的开源AI Agent框架OpenClaw。自2025年11月发布以来,OpenClaw在GitHub上已经获得了超过35万星标和超过7万fo…...

F2803x DSP ePWM模块实战:从基础配置到高精度电机控制

1. ePWM模块基础配置与电机控制入门 第一次接触F2803x的ePWM模块时,我完全被那些专业术语搞懵了。什么时基模块、比较模块、动作模块,听起来就像天书。但当我真正动手配置一个简单的电机驱动电路后,才发现这套系统设计得非常巧妙。下面我就用…...

intv_ai_mk11应用场景:研发团队每日站会纪要自动生成与关键结论提炼

intv_ai_mk11应用场景:研发团队每日站会纪要自动生成与关键结论提炼 1. 研发团队的站会痛点 每天早上9:30,技术团队都会准时开始15分钟的站会。每个成员轮流发言,汇报昨日进展、今日计划和遇到的障碍。这种敏捷开发实践虽然高效&#xff0c…...

【5G/4G】Snow 3G算法源码解析:从S盒到密钥流生成

1. Snow 3G算法概述 Snow 3G是3GPP组织为4G LTE和5G网络设计的流密码算法,主要用于无线通信中的数据加密和完整性保护。这个算法在2006年被正式采纳为UMTS和LTE的安全标准之一,与AES和ZUC算法一起构成了移动通信安全的核心防线。 我第一次接触Snow 3G是在…...

YOLO免配置训练包+智能标注工具:支持YOLOv5/v8/v10/v11一键训练,含易语言调用示例

温馨提示:文末有联系方式免环境部署,真正开箱即用 无需安装Python、CUDA、PyTorch等复杂依赖,本YOLO训练套件已封装完整运行时环境,Windows系统双击即可启动,彻底解决环境冲突与配置报错问。全版本YOLO模型支持&#x…...

从蓝牙到5G:一文搞懂日常无线技术背后的频率秘密(附实用对照表)

从蓝牙到5G:一文搞懂日常无线技术背后的频率秘密(附实用对照表) 每次打开手机连接WiFi时,是否想过为什么2.4GHz频段总是拥挤不堪?当蓝牙耳机偶尔断连,又是否意识到这与微波炉的工作频率有关?现代…...

还在拔插烧录线?一文带你手撕 Bootloader,实现单片机优雅的 OTA 升级

前言: 在单片机(如 STM32)的开发中,大部分人的认知是:代码是从 0x08000000 这个 Flash 首地址开始执行的。但如果我们要实现无线升级,单片机里就必须同时装下两套程序:一套是专门负责接收新代码…...

5分钟轻松搞定Windows与Office激活:KMS_VL_ALL_AIO智能脚本全攻略

5分钟轻松搞定Windows与Office激活:KMS_VL_ALL_AIO智能脚本全攻略 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows和Office的激活问题烦恼吗?面对复杂的命令…...

iPhone 17 Pro 用户必看:iOS 26 Adaptive Power 模式深度评测(含 5 大省电场景实测数据)

iPhone 17 Pro 用户必看:iOS 26 Adaptive Power 模式深度评测(含 5 大省电场景实测数据) 当 iPhone 17 Pro 遇上 iOS 26,最令人期待的莫过于那个藏在设置深处的「Adaptive Power」开关。这不是简单的低电量模式升级版&#xff0c…...

3个场景,1个解决方案:彻底告别Windows音量弹窗的干扰

3个场景,1个解决方案:彻底告别Windows音量弹窗的干扰 【免费下载链接】HideVolumeOSD Hide the Windows 10 volume bar 项目地址: https://gitcode.com/gh_mirrors/hi/HideVolumeOSD 你是否曾在全屏游戏中调整音量时,被突然弹出的音量…...