【数据库】MySql深度分页SQL查询优化
问题描述
mysql中,使用limit+offset实现分页难免会遇到深度分页问题,即页码数越大,性能越差。
select * from student order by id limit 200000,10;
如上语句,其实我们希望查询第20000页的10条数据,实际执行会发现耗时比获取第1页的10条慢很多。
原因分析
参考https://blog.csdn.net/cschmin/article/details/123148092解释的limit+offset实现原理,便可知道,mysql引擎层其实是把offset+limit条记录,全部返回给server层了,server层再过滤掉前offset条记录,把最后10条记录返回给客户端。显而易见,由于引擎层的“懒惰”,给server层造成了巨大的压力,以及数据传输带来的资源消耗。
优化方法
(1)子查询优化
select *
from student t1, (select id from student order by id limit 200000,10) t2
where t1.id=t2.id;
网上挺多文章说这种优化是借助了select只选择id一个列,符合了覆盖索引规则,所以快速跳过了前200000条记录,亦或是说避免了回表操作,两种说法都是扯蛋。这个子查询优化的本质是大大减少了引擎层返回给server的数据量而已。假如student表的列很少且很小,例如只有id、name两个字段,你再试试这个优化,基本没有效果。所以这个子查询优化的应用场景是表的行很大时,可以优化引擎层返给server层的数据量,数据条数并没有减少。而且由于子查询的存在,引擎层和server层的交互多了一次(第一次是子查询返回给server层200010个id,第二次返回给server层10条完整记录)。
(2)不使用limit+offset
改用标记法来实现分页,这也是企业级业务上比较常用的方法。标记法每次查询都携带着起始条件:
select * from student where id>200000 limit 10;
其中200000就是调用者当前页的起始位置。
优点:
- 直接规避了深度分页问题
缺点:
- 需要调用者自己维护标记(例如当前页起始于20,结束于29,那么调用者要自己算出下一页起始是30);
- 不太容易通过页码直接跳转了(例如从第3页跳到第20000页);
(3)使用ElasticSearch
考虑将mysql数据同步到ES,然后借助ES来实现分页查询。不过,ES也会遇到深度分页的问题 ,只是没有mysql来的那么早而已。 例如我司在做某个文件管理库时,由于文件太多了,即便做了分表,数据量依然很大,查询负担太大,于是上层通过ES用于一些查询。
案例测试
---------------------------------------------------------------
-- 创建一个测试表
---------------------------------------------------------------
CREATE TABLE `student` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(40) COLLATE utf8mb4_bin DEFAULT NULL,`age` int DEFAULT NULL,`feild_1` char(255) COLLATE utf8mb4_bin DEFAULT NULL,`feild_2` char(255) COLLATE utf8mb4_bin DEFAULT NULL,`feild_3` char(255) COLLATE utf8mb4_bin DEFAULT NULL,`feild_4` char(255) COLLATE utf8mb4_bin DEFAULT NULL,`feild_5` char(255) COLLATE utf8mb4_bin DEFAULT NULL,`feild_6` char(255) COLLATE utf8mb4_bin DEFAULT NULL,`feild_7` char(255) COLLATE utf8mb4_bin DEFAULT NULL,`feild_8` char(255) COLLATE utf8mb4_bin DEFAULT NULL,`feild_9` char(255) COLLATE utf8mb4_bin DEFAULT NULL,`feild_10` char(255) COLLATE utf8mb4_bin DEFAULT NULL,`feild_11` char(255) COLLATE utf8mb4_bin DEFAULT NULL,`feild_12` char(255) COLLATE utf8mb4_bin DEFAULT NULL,`feild_13` char(255) COLLATE utf8mb4_bin DEFAULT NULL,`feild_14` char(255) COLLATE utf8mb4_bin DEFAULT NULL,`feild_15` char(255) COLLATE utf8mb4_bin DEFAULT NULL,`feild_16` char(255) COLLATE utf8mb4_bin DEFAULT NULL,`feild_17` char(255) COLLATE utf8mb4_bin DEFAULT NULL,`feild_18` char(255) COLLATE utf8mb4_bin DEFAULT NULL,`feild_19` char(255) COLLATE utf8mb4_bin DEFAULT NULL,`feild_20` char(255) COLLATE utf8mb4_bin DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE,KEY `idx_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=208505 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;---------------------------------------------------------------
-- 随机生成20万记录
---------------------------------------------------------------
DELIMITER //
CREATE PROCEDURE insert_student(IN n INT)
BEGINDECLARE i INT DEFAULT 0;WHILE i < n DOINSERT INTO student (age, name) VALUES (FLOOR(RAND() * 100), LEFT(UUID(), 8));SET i = i + 1;END WHILE;
END //
DELIMITER ;CALL insert_student(200000);select count(*) from student;---------------------------------------------------------------
-- 深度分页耗时测试
---------------------------------------------------------------
select * from student limit 200000,10; -- 977msselect id,feild_1,feild_2,feild_3,feild_4,feild_5,feild_6,feild_7,feild_8,feild_9 from student order by id limit 200000,10 -- 475msselect id,feild_1 from student order by id limit 200000,10 -- 138msselect id from student limit 200000,10; -- 65msselect *
from student t1, (select id,feild_1,feild_2,feild_3,feild_4,feild_5,feild_6,feild_7,feild_8,feild_9 from student order by id limit 200000,10) t2
where t1.id=t2.id; -- 443msselect *
from student t1, (select id from student order by id limit 200000,10) t2
where t1.id=t2.id; -- 60ms
相关文章:
【数据库】MySql深度分页SQL查询优化
问题描述 mysql中,使用limitoffset实现分页难免会遇到深度分页问题,即页码数越大,性能越差。 select * from student order by id limit 200000,10;如上语句,其实我们希望查询第20000页的10条数据,实际执行会发现耗时…...

黑马Java零基础视频教程精华部分_14_正则表达式
系列文章目录 文章目录 系列文章目录一、先爽一下正则表达式不使用正则的情况下使用正则的情况下 二、正则表达式的作用三、正则表达式具体表达1、规则2、字符类示例3、预定义字符示例首先学习转义字符 示例练习 四、基本练习1、快捷方法:2、验证手机号3、验证座机电…...

20240812 每日AI必读资讯
黑匣子被打开了!能玩的Transformer可视化解释工具:Transformer Explainer - 佐治亚理工学院和 IBM 研究院开发一款基于 web 的开源交互式可视化工具「Transformer Explainer」,帮助非专业人士了解 Transformer 的高级模型结构和低级数学运算…...
C++ 项目中的类框架
/* * 类调用框架 */ /* CameraApp.h */ class CameraApp { public: CameraApp(); ~CameraApp(); int Init(void); int UnInit(void); public: XnetNode m_xnode_thd; XcamServer m_xcam_thd; }; /* CameraApp.cpp */ CameraApp::CameraApp(): m_…...
【Python随笔】比PyQt5更先进的pyside6安装和使用方法
最近因为自研日常开发工具的需求,决定重新拾起PyQt5之类的桌面工具开发技术栈,为啥选用PyQt,一是因为笔者比较精通python,二是因为不需要在外观上做什么特别的东西。经过一番调研,发现当前的PyQt5版本已经过时…...

如何给 VMware Workstation 虚拟机配置代理
文章目录 步骤一:检查虚拟机网络设置步骤二:获取代理服务器 IP 地址步骤三:配置虚拟机的代理设置步骤四:验证代理配置总结 在使用 VMware Workstation 虚拟机时,有时候我们需要通过代理服务器访问外部网络资源。本文将…...

前端路由VueRouter总结
简介: Vue路由vue-router是官方的路由插件,能够轻松的管理 SPA 项目中组件的切换。Vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来vue-router 目前有 3.x 的版本和 4.x 的版本,vue-…...

基于SpringBoot+Vue的铁路订票管理系统(带1w+文档)
基于SpringBootVue的铁路订票管理系统(带1w文档) 基于SpringBootVue的铁路订票管理系统(带1w文档) 铁路订票管理工作向来都是社会上不可或缺的一部分,然而多年以来人们大都习惯使用传统方法,即人工来完成铁路订票的管理,但是这种方法存在着工…...

Firefox滚动条在Win10和Win11下表现不一致问题?
文章目录 前言总结解决方法 前言 最近在写页面的时候发现一个非常有意思的事。Firefox滚动条在Win10和Win11下表现居然不一致。在网上几经查找资料, 终于找到原因所在。总结成下面的文章,加深印象也防止下次遇到。 总结 参考文章: Firefox…...
vue3 组件传参
import {reactive,defineProps,onMounted,ref} from vue const props defineProps({ projectInfo: { type: Object, default: () > { return {}; } } }); console.log("🚀 ~ 审核详情项目概述:", props.projectInfo) <Detail v-if"isReady…...
unity自动添加头部注释脚本
unity自动添加头部注释脚本,放在Assets目录自动生效 public class ScriptCreateInit : UnityEditor.AssetModificationProcessor {private static void OnWillCreateAsset(string path){path path.Replace(".meta", "");if (path.EndsWith(&qu…...

Raw格式化后文件能恢复吗 电脑磁盘格式化后如何恢复数据 硬盘格式变成了raw怎么恢复
硬盘、U盘等移动存储设备在存储数据文件上是非常方便的,不过在使用过程中也会因为操作、或者本身设备问题,导致存储设备出现各种各样的问题。较为常见的问题就是存储设备格式化、存储设备格式变为Raw格式等。今天要给大家分享的是有关Raw格式化的相关内容…...
Android targetSdkVersion改成33遇到的坑
targetSdkVersion 改成 33 ,遇到一些坑。 需要注意的地方: 修改 targetSdkVersion 为 33。AndroidManifest.xml 里添加 android:exported“true”升级 Gradle 版本。升级第三方库。 修改 app 的 build.gradle , android {compileSdkVersi…...

1985-2023年中国城市统计年鉴(PDF+EXCEL)
1985-2023年中国城市统计年鉴 1、时间:1985-2023年 2、格式:1985-2023年PDF版本,1993-2023年excel格式 3、说明:中国城市统计年鉴收录了全国各级城市社会经济发展等方面的主要统计数据,数据来源于各城市的相关部门。…...

从AI小白到大神的7个细节:让你开窍逆袭
在当今科技界,人工智能无疑是最炙手可热的话题。然而,这个领域充斥着专业术语,使得理解每次技术革新的具体内容变得颇具挑战性。 为了帮助读者更好地把握时代脉搏,本文整理了一系列常见的人工智能(AI)术语…...

AIxBoard部署BLIP模型进行图文问答
一、AIxBoard简介 AIxBoard(X板)是一款IA架构的人工智能嵌入式开发板,体积小巧功能强大,可让您在图像分类、目标检测、分割和语音处理等应用中并行运行多个神经网络。它是一款面向专业创客、开发者的功能强大的小型计算机…...
小白零基础学数学建模应用系列(一):探索自由下落模型——以“坠落的硬币”为例
在数学建模竞赛中,选择一个易于理解且有趣的物理现象作为研究对象,往往能够使模型的构建和分析更具吸引力和说服力。本篇文章将以“坠落的硬币”这一经典的自由下落问题为例,探讨如何通过建立物理模型来验证或推翻常见的物理误解,…...

linux主机间免密登录
目录 原理: 相关命令: 一,执行命令 cd ~/.ssh/ ,进入目录 二,如果没有公钥和秘钥文件,则执行命令来生成 三,负责公钥给远端端服务器命令 四,实操 场景一,localhos…...

【海思SS626 | VB】关于 视频缓存池 的理解
😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…...

RCE漏洞及绕过
目录 1、RCE概述 (1)命令执行函数 (2)代码执行函数 2、回调后门 3、eval和assert 限制字符长度绕过 (1)反引号或exec (2)file_put_contents写入文件 (3ÿ…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...

R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...
webpack面试题
面试题:webpack介绍和简单使用 一、webpack(模块化打包工具)1. webpack是把项目当作一个整体,通过给定的一个主文件,webpack将从这个主文件开始找到你项目当中的所有依赖文件,使用loaders来处理它们&#x…...
更新 Docker 容器中的某一个文件
🔄 如何更新 Docker 容器中的某一个文件 以下是几种在 Docker 中更新单个文件的常用方法,适用于不同场景。 ✅ 方法一:使用 docker cp 拷贝文件到容器中(最简单) 🧰 命令格式: docker cp <…...

多模态大语言模型arxiv论文略读(110)
CoVLA: Comprehensive Vision-Language-Action Dataset for Autonomous Driving ➡️ 论文标题:CoVLA: Comprehensive Vision-Language-Action Dataset for Autonomous Driving ➡️ 论文作者:Hidehisa Arai, Keita Miwa, Kento Sasaki, Yu Yamaguchi, …...

MAZANOKE结合内网穿透技术实现跨地域图像优化服务的远程访问过程
文章目录 前言1. 关于MAZANOKE2. Docker部署3. 简单使用MAZANOKE4. 安装cpolar内网穿透5. 配置公网地址6. 配置固定公网地址总结 前言 在数字世界高速发展的今天,您是否察觉到那些静默增长的视觉数据正在悄然蚕食存储空间?随着影像记录成为日常习惯&…...