MySQL深分页和浅分页

news2024/9/21 20:55:22

前言

最近有面试过也遇到了问关于深分页问题,在这里简单从MySQL、ES等方面分享一下自己对该问题认识和总结。

一、深分页定义

可以从ES定义上来划分浅分页和深分页的边界,即页数超过10000页为深分页,少于10000页为浅分页。

二、MySQL深分页

关于MySQL深分页问题先看一下以下这条SQL语句:

SELECT	* FROM	t_order WHERE user_id = 1001 LIMIT 1000000, 10 
--------------------------------------------------------------
查询时间:89.15s

如果t_order表数据超过1000w直接执行以上SQL会非常慢,这就是典型深分页问题。
简单说一下关于在MySQL上limit执行过程:是会先扫描offset+n行,然后再丢弃掉前offset行,返回后n行数据。
从这里就可以看出来以上SQL之所有会慢主要问题是因为做了大量(offset+n行)的回表操作,则关于MySQL深分页问题主要是大量回表问题。

1.最大ID 

select * from table_name where id > 最大id limit 10000, 10

具体实现是:每一次查询把本批数据的最大ID传给前端,查询下一页的时候再带到后台。
这种方式有一个很大的局限性问题就是它只适用于主键ID自增的情况,分布式ID(雪花算法等)则不行,还需要考虑连续型字段datetime,sequence 等。

该方案可以极大优化MySQL深分页问题,能优化到ms级别。

 2.延迟关联

刚刚有提到MySQL深分页问题主要是回表问题,那么解决回表问题肯定得用到索引覆盖技术,在《高性能MySQL》书上叫这种解决深分页问题的方法叫做延迟关联。

SELECT	* FROM	t_order t
RIGHT JOIN (
	SELECT id
	FROM t_order
	WHERE user_id = 1001
	LIMIT 1000000,50
) tmp ON tmp.id = t.id
--------------------------------------------------------------

该方案解决了id不需要自增的问题,但是优化性能较低,在数据量大的情况下只能优化到秒级别的。

三、ES深分页

1.浅分页

ES浅分页(From,Size)过程:ES是基于数据分片的,假设有3个分片,from=100,size=10。则会根据排序规则从3个分片中各取回100条数据数据,然后汇总成300条数据后选择最后面的10条数据。
且From最大默认值是10000,如果超过这个值就会报错,虽然这个最大值可以修改,但是不推荐,因为会极大的影响查询效率。

2.scroll深分页

为了满足深度分页的场景,ES 提供了 scroll 的方式进行分页读取。
原理上是对某次查询生成一个游标 scroll_id , 后续的查询只需要根据这个游标去取数据,直到结果集中返回的 hits 字段为空,就表示遍历结束。scroll_id 的生成可以理解为建立了一个临时的历史快照,在此之后的增删改查等操作不会影响到这个快照的结果。
scroll方式官方的建议并不是用于实时的请求,因为每一个 scroll_id 不仅会占用大量的资源(特别是排序的请求),而且是生成的历史快照,对于数据的变更不会反映到快照上。这种方式往往用于非实时处理大量数据的情况,比如要进行数据迁移或者索引变更之类的

3.search_after深分页

ES5之后提供search_after,它是假分页方式,基本原理是根据上一页的最后一条,确定下一页的位置。
可以支持实时检索,而且性能也比scroll好,但是它只能一直下一页。

通过以上对比可以看出来ES的深分页方案也并没解决常见的需求问题。

四、常见深分页案例

一般数据量级别没有达到时根本就不存在什么深分页问题,那么我们可以看一下淘宝和京东他们是怎么解决深分页问题:

固定分页:无论有多少页数据都对检索后数据只取前100页。

滚动分页:只支持上一页或下一页操作。

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

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

相关文章

数字化时代:蚓链助力企业破局与腾飞!

在当今数字化浪潮汹涌澎湃的时代,企业面临着前新机遇与新挑战。您是否渴望在竞争激烈的市场中实现数字化弯道超车?是否梦想着打造专属自己的独特生意赛道?是否期盼着拥有专享的资源生态圈?如果您的答案是肯定的,那么蚓…

CSP - J day9

一. 题目 (1)早安 思路: (1)cin和scanf读入字符串时遇到空格或换行就停止读入,对于要读入带空格的字符串时,常用 两种方法: // 法一string s;getline( cin, s ); // 法…

OrangePi AIpro学习1 —— 烧写和ssh系统

目录 一、下载烧写工具和系统 二、烧写和启动 2.1 烧写和启动 2.2 烧写失败后的问题解决 三、串口连接到主机 3.1 串口连接到主机 四、网络连接到主机 4.1 修改香橙派IP地址 4.2 win11配置以太网静态ip 4.4 主机和香橙派直连 4.5 主机和香橙派连接到同一个路由器 五…

Hive SQL进阶:掌握间隔连续查询技巧,优化大数据分析(二)

目录 1.访问次数最多的5个用户 2.近 30 天的每日活跃用户数 3.获取1-180天注册活跃留存表 4.学生名次统计 5.最近连续3周连续活跃用户数 6.最近7天内连续3天活跃用户数 7.餐馆营业额变化增长 相关拓展 1.访问次数最多的5个用户 输出每个app 下访问次数最多的5个用户 返…

DC-7靶机渗透测试

DC-7靶机 DC: 7 ~ VulnHub 文章目录 DC-7靶机信息收集web渗透权限提升Drupal后台getshell权限提升靶机总结信息收集 经过扫描得到IP地址为192.168.78.154.其中开启了ssh和80端口,看来立足点就在于web渗透找到漏洞,获取用户密码来进行ssh连接进行寻找提权方案了使用dirb扫描…

Windows平台下内存泄漏检测工具Visual Leak detector介绍(vscode使用)

!!!此工具只能检测配合VC进行代码的内存泄漏检测 1、搜索VLD工具下载 2、配置环境变量 3、在main.cpp中加入#include<vld.h> 4、在CMakeLists.txt中添加 SET(VLD_PATH "xxx") # 链接vld静态库 target_link_libraries(${PROJECT_NAME} PRIVATE ${VLD_PATH})…

学习STM32(2)--STM32单片机GPIO应用

目录 1 引 言 2 实验目的 3 实验内容 3.1掌握STM32F103的GPIO控制 3.1.1 GPIO的分组 3.1.2 GPIO的常用功能 3.1.3 STM32单片机GPIO位结构 3.1.4 STM32单片机GPIO工作模式 3.1.5 STM32的GPIO 输出-点亮LED编程要点 使用GPIO时&#xff0c;按下面步骤进行&#xff1…

antd-5版本table组件修改滚动条样式不生效问题

问题描述 在react项目中使用antd-ProComponents组件库的Protable组件时修改table自带的滚动条样式不生效。 排查记录 一般来说直接table组件库要自定义滚动条的样式&#xff0c;只需要修改 ant-table-body 的样式即可&#xff0c;代码如下&#xff1a; .ant-table-body {&am…

pikachu文件包含漏洞

一&#xff1a;漏洞基础 程序在引用文件的时&#xff0c;引用的文件名存在可控的情况&#xff0c;传入的文件名没有经过合理的校验或校验不严&#xff0c;从而操作了预想之外的文件&#xff0c;就有可能导致文件泄漏和恶意的代码注入&#xff1b; 文件包含漏洞概念 在PHP程序…

如果忘了Linux密码如何重置?

忘记密码是我们常会遇到的情况之一&#xff0c;无论是在操作系统、网站账户、手机、电子邮件还是其他渠道上。 忘记密码是我们常会遇到的情况之一&#xff0c;无论是在操作系统、网站账户、手机、电子邮件还是其他渠道上。有时候如果密码需要符合特定的复杂性要求&#xff0c;…

【C++题解】1023. 判断素数

欢迎关注本专栏《C从零基础到信奥赛入门级&#xff08;CSP-J&#xff09;》 问题&#xff1a;1023. 判断素数 类型&#xff1a;函数&#xff0c;sqrt函数入门 题目描述&#xff1a; 任意输入一个整数&#xff0c;判断它是否为素数。是的话输出 T ,不是的话输出 F。 质数又称…

从传统监控到智能化升级:EasyCVR视频汇聚平台的一站式解决方案

随着科技的飞速发展和社会的不断进步&#xff0c;视频监控已经成为现代社会治安防控、企业管理等场景安全管理中不可或缺的一部分。而在视频监控领域&#xff0c;EasyCVR视频汇聚平台凭借其强大的多协议接入能力&#xff0c;在复杂多变的网络环境中展现出了卓越的性能和广泛的应…

Android 12系统源码_多屏幕(一)多屏幕设备显示Activity

前言 分屏&#xff1a;是指一个屏幕分出多个窗口&#xff0c;分别显示不同应用的界面&#xff0c;这在当前的手机设备中很常见。多屏&#xff1a;是指一个设备存在多个屏幕&#xff0c;这些可能是虚拟屏幕或者实体硬件屏幕&#xff0c;不同的应用同时显示在不同的屏幕中&#…

全面解析:msvcp140_atomic_wait.dll 丢失的解决之道,助你轻松应对

在尝试解决“msvcp140_atomic_wait.dll丢失”的问题时&#xff0c;首先需要确认错误信息的准确性。用户应仔细检查在启动程序或执行特定操作时是否确实出现了这一错误提示。确认错误后&#xff0c;可以进一步采取措施来解决问题。这包括检查系统日志和错误报告&#xff0c;以确…

RK3562J技术分享 | 使用SPI挂载数字式RTD温度传感器的方法

MAX31865是简单易用的热敏电阻至数字输出转换器&#xff0c;优化用于铂电阻温度检测器(RTD)。外部电阻设置RTD灵敏度&#xff0c;高精度Δ-Σ ADC将RTD电阻与基准电阻之比转换为数字输出。MAX31865输入具有高达45V的过压保护&#xff0c;提供可配置的RTD及电缆开路、短路条件检…

如何避免或者减少线上空指针问题的发生

一、背景 在我们的日常工作中&#xff0c;我们会经常遇到空指针问题&#xff0c;理论上来说只是一个判段空指针的小问题&#xff0c;但是因为这行代码的报错&#xff0c;程序中断了后面的执行&#xff0c;可能导致整体业务逻辑受影响。那在工作中我们应该如何避免&#xff0c;…

layer.load 加倒计时

实现效果 loadinglayer.load(1, {content:"",shade: [0.7, #333],time:5000,success: function(layero,index) {var i 5;var timer null;var fn function() {// 显示的提示layero.find(".layui-layer-content").html(正在连接&#xff0c;请稍等&…

谷歌突然停止为应用程序生成胖APK 只提供AAB包可能会影响用户侧载安装

谷歌最初是在 2018 年开始准备 Android App Bundle (即 AAB) 安装包&#xff0c;到 2021 年这种格式已经成为默认格式&#xff0c;开发者在提交应用程序时需要将其构建为 AAB 格式方便 Google Play 应用商店分发。 AAB 格式的优势在于适用于不同屏幕尺寸、语言、CPU 架构和 An…

js基础与判断

1.加减乘除 2.逻辑运算符 4.分支 5.swicth switch与if-else区别 6.break和continue

Python list加了类型推断运行报错,TypeError: ‘type‘ object is not subscriptable,python3.7

问题描述&#xff1a; 在python3.7 版本 运行代码&#xff0c;报错 def retry( ignore_exception_type_info_list:list[IgnoreExceptionInfo]None):>>> TypeError: type object is not subscriptable解决方案&#xff1a; 去掉list内的参数推断,就正常了&#xff0…