Mysql大数据量分页优化

前言

之前有看过到mysql大数据量分页情况下性能会很差,但是没有探究过它的原因,今天讲一讲mysql大数据量下偏移量很大,性能很差的问题,并附上解决方式。

原因

将原因前我们先做一个试验,我做试验使用的是mysql5.7.24版本(mysql8上我也试验出来同样的问题),看看mysql是不是在偏移量比较大的时候分页会比较慢,性能比较差

版本

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.24    |
+-----------+
1 row in set (0.00 sec)

表结构

CREATE TABLE `trace_monitor_log` (`id` varchar(30) NOT NULL COMMENT '表主键id',`user_id` varchar(30) DEFAULT NULL COMMENT '用户id',`trace_id` varchar(30) DEFAULT NULL COMMENT '追踪id',`trace_type` varchar(30) DEFAULT NULL COMMENT '追踪类型',`path` mediumtext COMMENT '追踪路径',`source_ip` varchar(255) DEFAULT NULL COMMENT '来源ip',`ext_params` mediumtext COMMENT '请求扩展参数',`costs` int(11) DEFAULT '0' COMMENT '请求耗时(毫秒)',`exception` mediumtext COMMENT '异常信息',`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',PRIMARY KEY (`id`),KEY `trace_id` (`trace_id`),KEY `trace_type` (`trace_type`),KEY `create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='监控日志表';

试验过程

这个是我从测试环境找的一张日志表,里面的数据量是580万左右,我们先看看只查询普通10条数据的情况。

数据量

mysql> select count(*) from trace_monitor_log;
+----------+
| count(*) |
+----------+
|  5806836 |
+----------+
1 row in set (1.66 sec)
explain select * from trace_monitor_log order by trace_id limit 10;

image-20240128210052009

可以看到没有offset偏移量的时候可以直接走索引,key是trace_id,并且只查询了10条数据。

我们在来看看如果offset是1000的时候。

explain select * from trace_monitor_log order by trace_id limit 10 offset 1000;

image-20240128210345205

可以看到偏移量比较小的时候还是可以走索引,rows是1010,这时候发现虽然我们只要查询10条数据,但是查询的时候还是会扫描1000条无用的索引记录。

我们接下往下把offset加到100万

explain select * from trace_monitor_log order by trace_id limit 10 offset 1000000;

image-20240128210656849

这个时候就会发现一个神奇的现象,竟然没有走索引了,type是ALL,就是全表扫描了,执行时间大概花了40多秒,性能确实很差。这里的原因,本来根据索引查出来100万条记录,然后把不需要的数据给丢弃掉,mysql会计算查询成本,发现这样走索引还没有全表扫描快,所以用了全表扫描,但是全表扫描就为了拿到十条数据显然是性能很差的。mysql并不会自动判断先根据trace_id的索引找到偏移量需要的10条数据,再根据这10条索引找到叶子节点的主键记录去回表查询数据,导致了这么差的性能。

解决方式

1.延迟关联

先使用覆盖索引的方式找到对应order by 之后的limit条索引,因为是覆盖索引,直接用的索引记录,没有回表所以很快。接着在使用join的方式,将索引记录和原表关联起来就可以查出来对应的limit条数据。

explain select * from trace_monitor_log t1 join (select trace_id from trace_monitor_log  order by trace_id limit 1000000,10) t2 on t1.trace_id = t2.trace_id

image-20240128211946406

image-20240128212044859

执行时间平均在500-600毫秒左右,相比全表扫描快了很多。

2.书签记录

这个概念我也是从网上看到的,还没找到具体这个概念的出处在哪里。不过不要困于这个概念,只要理解是先找到对应要查询一条索引记录(书签),再根据这个索引去范围查询对应的limit条数数据就容易理解了。

explain select * from trace_monitor_log t1 where trace_id > (select trace_id from trace_monitor_log  order by trace_id limit 999999,1)   order by trace_id limit 10

image-20240128212614389

image-20240128213228356

执行时间和延迟关联差不多,也都走了索引,所以性能也比较好。

参考资料

1.mysql8官网limit优化

2.要想通过面试,MySQL的Limit子句底层原理你不可不知

3.从官方文档中探索MySQL分页的几种方式及分页优化

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

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

相关文章

Arm AArch64 alignment(对齐)

数据和指令必须与合适的边界保持对齐(alignment)。访问是否对齐会影响ARM核的性能,并且在将代码从早期的体系结构移植到ARMv8-A时可能会出现可移植性问题。出于性能原因,或者在移植代码时,都值得去注意下对齐问题。本文将讲述了ARMv8-A AArch…

初识人工智能,一文读懂贝叶斯优化进阶的知识文集(9)

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

[机器学习]简单线性回归——梯度下降法

一.梯度下降法概念 2.代码实现 # 0. 引入依赖 import numpy as np import matplotlib.pyplot as plt# 1. 导入数据(data.csv) points np.genfromtxt(data.csv, delimiter,) points[0,0]# 提取points中的两列数据,分别作为x,y …

[BUUCTF]-PWN:pwnable_hacknote解析

先看保护 32位,没开pie,got表可修改 看ida 总的来说就是alloc创建堆块,free释放堆块,show打印堆块内容 但alloc处的函数比较特别,他会先申请一个0x8大小的堆来存放与puts相关的指针 完整exp: from pwn …

<网络安全>《9 入侵防御系统IPS》

1 概念 IPS( Intrusion Prevention System)是电脑网络安全设施,是对防病毒软件(Antivirus Programs)和防火墙(Packet Filter, Application Gateway)的补充。 入侵预防系统(Intrusio…

数据结构【图的遍历】

数据结构之图 图的类型定义和存储结构图的遍历遍历的定义图的特点图常用的遍历深度优先搜索 DFS(DepthFirstSearch)算法实现算法效率分析 广度优先搜索 BFS(BreadthFirstSearch)算法实现算法效率分析 DFS与BFS算法效率比较 图的类…

第八篇【传奇开心果短博文系列】Python的OpenCV技术点案例示例:深度学习

传奇开心果短博文系列 系列短博文目录Python的OpenCV技术点案例示例系列 短博文目录一、前言二、OpenCV深度学习介绍三、OpenCV常用深度学习算法和实现分别示例代码四、归纳总结 系列短博文目录 Python的OpenCV技术点案例示例系列 短博文目录 一、前言 OpenCV深度学习&…

【UVM源码】UVM Config_db机制使用总结与源码解析

UVM Config_db机制使用总结与源码解析 UVM Config_db机制介绍UVM Config_db 机制引入的背景基本介绍使用方法优缺点: UVM Config_db机制使用示例:UVM Config_db使用高阶规则Config_db资源优先级 UVM Config_db 源码解析 UVM Config_db机制介绍 UVM Conf…

idea引入ojdbc包报错

网上下载或者让同事传两个jar过来,ojdbc6-11.2.0.7.0.jar 以及jconn3.0.jar 放入同一个文件夹中: 在此文件夹中cmd如下:回车,进入cmd控制台。 输入如下两个命令: mvn install:install-file -DgroupIdcom.oracle -Dar…

【网络】:网络套接字

网络套接字 一.网络字节序二.端口号三.socket1.常见的API2.封装UdpSocket 网络通信的本质就是进程间通信。 一.网络字节序 我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分,网络数据流同样有大…

可曾听闻Nginx?

目录 一.简介 二.Nginx的优点 三.反向代理 四.负载均衡 五.动静分离 六.总结 说起Nginx,耳边好像经常听到,但是不知道用来干嘛的。最近用到了,所以我就大概总结了基本知识,它经常与一个词出现在一起——反向代理。那接下来…

配置华为交换机环路检测案例

知识改变命运,技术就是要分享,有问题随时联系,免费答疑,欢迎联系! 厦门微思网络​​​​​​https://www.xmws.cn 华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom 思科认证\CCNA\CCNP\CCIE Linux\RHCE…

YOLOv5可视化热力图 | 支持自定义模型、置信度选择等功能(论文必备)

一、本文介绍 本文给大家带来的机制是的可视化热力图功能,热力图作为我们论文当中的必备一环,可以展示出我们呈现机制的有效性,本文的内容支持YOLOv5最新版本,同时支持视频讲解,本文的内容是根据检测头的输出内容,然后来绘图。 在开始之前给大家推荐一下我的专栏,本专…

Vue服务器端渲染(SSR)是不是技术的倒退?

一、什么是服务器端渲染,是不是技术退步? Vue服务器端渲染(Vue Server-Side Rendering,简称SSR)是一种将Vue组件在服务器端进行渲染,生成最终的HTML页面,然后将其发送给客户端的技术。 传统的V…

烧录软件(Renesas Flash Programmer)瑞萨RL78G12系列单片机下载工具(E2)的软件配置与硬件链接说明

一、单片机与仿真器连接 E1引脚接线图 RL78系列单片机的GND接仿真器的pin2、pin12、pin14 RL78系列单片机的VDD接仿真器的pin8 RL78系列单片机的Tool0接仿真器的pin5 RL78系列单片机的Reset接仿真器的pin10、pin13 二、确认接线完成后,开始烧录 1、打开RFPV软件…

C 练习实例50-使用Dev-C++创建项目(圆形体体积计算器)

项目展示 项目案例&#xff1a;圆形体体积计算器 vol.h文件 #include <stdio.h> #include <math.h> #define PI 3.141592654 void cal(int sel); //函数声明 double vol_ball(void); double vol_cylind(void); double vol_cone(void); main.c文件 #include &quo…

【数字通信】数字带通传输

数字调制和数字带通传输系统 数字调制解调 数字调制 用数字基带信号控制载波&#xff0c;把数字基带信号变换为数字带通信号的过程 目的&#xff1a;数字基带信号含大量低频分量&#xff0c;无法通过具有带通特性的信道传输。需对数字基带信号进行数字调制使信号与信道的特…

网际协议 IP、IP地址

目录 网际协议 IP 虚拟互连网络 使用中间设备进行互连 IP 地址 IP 地址及其表示方法 ​编辑 IP 地址采用 2 级结构 IP 地址的编址方法 分类的 IP 地址 各类 IP 地址的指派范围 一般不使用的特殊的 IP 地址 IPv4网络中的地址类型 分类的 IP 地址的优点和缺点 划分子网…

数字媒体技术基础之:声波及其测量

声音始于空气中的振动&#xff0c;如吉他弦、人的声带或扬声器纸盆产生的振动。 这些振动一起推动邻近的空气分子&#xff0c;从而轻微增加空气压力。 压力下的空气分子随后推动周围的空气分子&#xff0c;后者又推动下一组分子&#xff0c;依此类推。 高压区域穿过空气时&…

链表中倒数第k个结点

题目描述 输入一个链表&#xff0c;输出该链表中倒数第k个结点。 这道题首先按照普通的方法用一个栈来存放链表数据然后在取出第k的数就可以了,但是这种方法的时间复杂度是O(n),不提倡; 现在我介绍一种时间复杂度为O(n-k)的方法,老规矩-->先贴源码,在分析: /*public clas…