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

【数据库】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中&#xff0c;使用limitoffset实现分页难免会遇到深度分页问题&#xff0c;即页码数越大&#xff0c;性能越差。 select * from student order by id limit 200000,10;如上语句&#xff0c;其实我们希望查询第20000页的10条数据&#xff0c;实际执行会发现耗时…...

黑马Java零基础视频教程精华部分_14_正则表达式

系列文章目录 文章目录 系列文章目录一、先爽一下正则表达式不使用正则的情况下使用正则的情况下 二、正则表达式的作用三、正则表达式具体表达1、规则2、字符类示例3、预定义字符示例首先学习转义字符 示例练习 四、基本练习1、快捷方法&#xff1a;2、验证手机号3、验证座机电…...

20240812 每日AI必读资讯

黑匣子被打开了&#xff01;能玩的Transformer可视化解释工具&#xff1a;Transformer Explainer - 佐治亚理工学院和 IBM 研究院开发一款基于 web 的开源交互式可视化工具「Transformer Explainer」&#xff0c;帮助非专业人士了解 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安装和使用方法

最近因为自研日常开发工具的需求&#xff0c;决定重新拾起PyQt5之类的桌面工具开发技术栈&#xff0c;为啥选用PyQt&#xff0c;一是因为笔者比较精通python&#xff0c;二是因为不需要在外观上做什么特别的东西。经过一番调研&#xff0c;发现当前的PyQt5版本已经过时&#xf…...

如何给 VMware Workstation 虚拟机配置代理

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

前端路由VueRouter总结

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

基于SpringBoot+Vue的铁路订票管理系统(带1w+文档)

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

Firefox滚动条在Win10和Win11下表现不一致问题?

文章目录 前言总结解决方法 前言 最近在写页面的时候发现一个非常有意思的事。Firefox滚动条在Win10和Win11下表现居然不一致。在网上几经查找资料&#xff0c; 终于找到原因所在。总结成下面的文章&#xff0c;加深印象也防止下次遇到。 总结 参考文章&#xff1a; Firefox…...

vue3 组件传参

import {reactive,defineProps,onMounted,ref} from vue const props defineProps({ projectInfo: { type: Object, default: () > { return {}; } } }); console.log("&#x1f680; ~ 审核详情项目概述:", props.projectInfo) <Detail v-if"isReady…...

unity自动添加头部注释脚本

unity自动添加头部注释脚本&#xff0c;放在Assets目录自动生效 public class ScriptCreateInit : UnityEditor.AssetModificationProcessor {private static void OnWillCreateAsset(string path){path path.Replace(".meta", "");if (path.EndsWith(&qu…...

Raw格式化后文件能恢复吗 电脑磁盘格式化后如何恢复数据 硬盘格式变成了raw怎么恢复

硬盘、U盘等移动存储设备在存储数据文件上是非常方便的&#xff0c;不过在使用过程中也会因为操作、或者本身设备问题&#xff0c;导致存储设备出现各种各样的问题。较为常见的问题就是存储设备格式化、存储设备格式变为Raw格式等。今天要给大家分享的是有关Raw格式化的相关内容…...

Android targetSdkVersion改成33遇到的坑

targetSdkVersion 改成 33 &#xff0c;遇到一些坑。 需要注意的地方&#xff1a; 修改 targetSdkVersion 为 33。AndroidManifest.xml 里添加 android:exported“true”升级 Gradle 版本。升级第三方库。 修改 app 的 build.gradle &#xff0c; android {compileSdkVersi…...

1985-2023年中国城市统计年鉴(PDF+EXCEL)

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

从AI小白到大神的7个细节:让你开窍逆袭

在当今科技界&#xff0c;人工智能无疑是最炙手可热的话题。然而&#xff0c;这个领域充斥着专业术语&#xff0c;使得理解每次技术革新的具体内容变得颇具挑战性。 为了帮助读者更好地把握时代脉搏&#xff0c;本文整理了一系列常见的人工智能&#xff08;AI&#xff09;术语…...

AIxBoard部署BLIP模型进行图文问答

一、AIxBoard简介 AIxBoard&#xff08;X板&#xff09;是一款IA架构的人工智能嵌入式开发板&#xff0c;体积小巧功能强大&#xff0c;可让您在图像分类、目标检测、分割和语音处理等应用中并行运行多个神经网络。它是一款面向专业创客、开发者的功能强大的小型计算机&#xf…...

小白零基础学数学建模应用系列(一):探索自由下落模型——以“坠落的硬币”为例

在数学建模竞赛中&#xff0c;选择一个易于理解且有趣的物理现象作为研究对象&#xff0c;往往能够使模型的构建和分析更具吸引力和说服力。本篇文章将以“坠落的硬币”这一经典的自由下落问题为例&#xff0c;探讨如何通过建立物理模型来验证或推翻常见的物理误解&#xff0c;…...

linux主机间免密登录

目录 原理&#xff1a; 相关命令&#xff1a; 一&#xff0c;执行命令 cd ~/.ssh/ &#xff0c;进入目录 二&#xff0c;如果没有公钥和秘钥文件&#xff0c;则执行命令来生成 三&#xff0c;负责公钥给远端端服务器命令 四&#xff0c;实操 场景一&#xff0c;localhos…...

【海思SS626 | VB】关于 视频缓存池 的理解

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…...

RCE漏洞及绕过

目录 1、RCE概述 &#xff08;1&#xff09;命令执行函数 &#xff08;2&#xff09;代码执行函数 2、回调后门 3、eval和assert 限制字符长度绕过 &#xff08;1&#xff09;反引号或exec &#xff08;2&#xff09;file_put_contents写入文件 &#xff08;3&#xff…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...