深度分页问题优化方案

问题原因

Mysql使用select * from table limit offset, rows分页在深度分页的情况下, 性能急剧下降。

例如:select * 的情况下直接⽤limit 600000,10 扫描的是约60万条数据,并且是需要回表 60W次,也就是说⼤部分性能都耗在随机访问上,到头来只⽤到10条数据(总共取600010条数据只留10条记录)

优化方案

前端方案:业务层面限制跨度比较大的跳页

提供2种风格分页器供用户选择

  1. 标准分页器,展示最后一页和跳转指定页输入框
    image.png
  2. 简单分页器
    image.png

参考
百度方案: 不展示最后一页和直接跳转指定分页的输入框
image.png
Google方案:只展示查看下一页的按钮
image.png

界面设计器选表格/画廊的属性面板提供分页器风格的属性下拉选择

image.png

xml示例
<!-- 表格使用的标准分页器 --> <view type="TABLE" paginationStyle="SIMPLE"> <!-- fields --> </view> <!-- 画廊使用默认的标准分页器 --> <view type="GALLERY" paginationStyle="STANDARD"> <!-- fields --> </view>

后端方案

  1. 使用索引:确保数据库表中的相关字段上创建了适当的索引。索引可以加快查询速度,特别是在处理大数据量时。

  2. 分批查询:将大数据分成多个较小的批次进行查询,而不是一次性查询全部数据。可以通过限制每次查询的数据量和使用合适的偏移量来实现分批查询,例如使用LIMIT和OFFSET子句。

  3. 基于游标的分页:使用基于游标的分页技术,而不是传统的偏移分页。游标分页是通过记录上一次查询的游标位置,在下一次查询时从该位置开始获取新的数据,避免了大偏移量的影响。这可以通过数据库自身的功能(例如MySQL的CURSOR)或使用第三方库来实现。

  4. 缓存数据:如果数据变化较少,可以考虑将查询结果缓存到内存中,以避免频繁地查询数据库。这样可以提高页面相应速度,并减轻数据库负担。缓存的数据应该根据业务需要及时更新。

  5. 数据预处理:如果查询结果经常需要进行复杂的计算或处理,可以考虑提前对数据进行预处理并缓存结果,以减少每次查询的计算负担。

  6. 数据库优化:针对具体数据库系统,可以根据实际情况进行数据库调优。例如,合理设置数据库连接池大小、调整数据库参数等。

  7. 分布式存储和计算:对于非关系型数据库或分布式存储系统,可以考虑使用分布式存储和计算方案,将数据分散存储在多个节点上,并通过计算节点并行处理查询请求,以提高性能和可伸缩性。

参考链接

MySQL深分页场景下的性能优化

Oinone社区 作者:原创文章,如若转载,请注明出处:https://doc.oinone.top/other/75.html

访问Oinone官网:https://www.oinone.top获取数式Oinone低代码应用平台体验

(0)
的头像
上一篇 2023年6月20日 pm4:07
下一篇 2023年11月2日 pm1:58

相关推荐

  • 早鸟版发布:Oinone 7.0.0 版本 升级 JDK17,优化全平台界面交互,邀您体验

    版本号: 7.0.0 版本发布日期:2025.12更新要点:升级 JDK17,优化全平台界面交互 7.0.0 版本 GitHub: 后端: https://github.com/oinone/oinone-pamirs 前端: https://github.com/oinone/oinone-kunlun Gitee: 后端: https://gitee.com/oinone/oinone-pamirs 前端: https://gitee.com/oinone/oinone-kunlun 升级说明及步骤 此版本升级时需要完整回归已有系统的已有功能,否则无法保证功能的正常使用。尤其是 javax -> jakarta 的变更会出现编译正常但无法正常运行的情况。 7.0.0升级详细说明及步骤 20260129 升级内容 镜像版本升级: 7.0.4 –> 7.0.5 后端版本升级: 7.0.4 –> 7.0.5.1 前端版本升级 修复新模型的表格首次设置冻结渲染错误的问题 修复流程设计器数据权限表单字段丢失问题 修复业务流程抽屉转换为弹窗时高度异常的问题 20260117 升级内容 镜像版本升级: 7.0.3.1 –> 7.0.4 后端版本升级: 7.0.3 –> 7.0.4 前端版本升级 修复语言保存时毫秒格式验证错误的问题 修复界面设计器多对一表单配置提交函数过滤错误的问题 修复元数据导入时菜单无法更新动作的问题 修复工作流集成接口在某些情况下参数处理错误的问题 20260109 升级内容 升级此版本需要开启元数据全量刷新 pamirs.distribution.session.allMetaRefresh=true 镜像版本升级: 7.0.2 –> 7.0.3.1 后端版本升级: 7.0.2 –> 7.0.3 前端版本升级 修复工作流数据安装 增加对函数操作日志 增加函数操作规则设置 用户登录日志增加扩展点 时间格式支持毫秒 Eip日志增加毫秒支持 优化导出API 的文档结构 点击查看用户手册 集成接口日志参数信息支持 JSON/XML 格式切换及一键复制 点击查看用户手册 数据库 API 支持格式化 / 压缩SQL格式 点击查看用户手册 数据流程增加毫秒支持 语言增加毫秒支持 集成接口和开发接口日志统计增加日期范围筛选 增加标准心跳检查 trigger增加扩展点,适配多租户场景 增加导入文件URL错误,获取不到JSON的日志 解决元数据增强可能出现的死循环 修复集成设计器弹窗宽度问题 修复表格配置双击行动作,未预留动作区高度的问题 修复自定义 mask 变更 actionBar 插槽名称导致无法正常渲染的问题 20251229 升级内容 镜像版本升级: 7.0.1 –> 7.0.2 后端版本升级: 7.0.1 –> 7.0.2 前端版本升级 修复工作流元数据安装异常的问题 前端包名变更:@kunlun/vue-grid-layout@2.3.13 –> @oinone/vue-grid-layout@2.3.13 前端包名变更:webpack-aliyun-oss@0.5.2 –> @oinone/webpack-aliyun-oss@0.5.2 npmrc 统一配置 registry=https://registry.npmmirror.com/ @oinone:registry=http://nexus.shushi.pro/repository/kunlun/ legacy-peer-deps=true 20251220 升级内容 镜像版本升级: 7.0.0 –> 7.0.1 前端版本升级 界面设计器上传图片组件新增cdnKey配置 修复系统权限字段丢失导致无法正常运行的问题 修复全屏按钮悬浮文案 修复快捷键提示文案 修复取消排序展示错误的问题 修复快速填报选择不粘贴时数据处理错误的问题 修复流程设计器无法编辑流程名称的问题 修复移动端打包失败的问题 修复体验镜像RocketMQ无法正常启动的问题 20251217 升级内容 镜像版本升级: 7.0.0 后端版本升级: 7.0.1 前端版本升级 升级 JDK17 优化默认视图内容展示 表格视图新增多级排序、分组、快捷键录入、行高切换与全屏模式,并优化行内编辑启用逻辑 日志记录支持刷新 画廊视图新增展示字段、卡片数量切换、排序与全屏模式 弹窗与抽屉支持互相转换、全屏展示与记录数据切换 支持隐藏按钮文字 一对多子表新增快速填报能力 优化公司、部门、角色、员工组件体验 修复文件组件在默认视图中的识别问题 优化多行文本与富文本在默认视图中的展示宽度 优化子表默认展示动作 优化操作栏被隐藏时的视图展示效果 界面设计器组件库新增展示形态切换 属性面板顶部名称支持一键复制,并将开关/复选框配置项调整为下拉选择组件 属性面板新增样式面板 操作栏新增样式配置,支持配置样式与显示数量 按钮新增“文字按钮”样式 新增选项卡、分组、布局容器、表单、表格等样式配置能力 增加“保存为草稿”组件 新增表格下拉单选/多选、弹窗单选/多选组件 优化表达式搜索能力 优化数据加载函数的可选项配置 增加单行文本输入格式设置 后端版本包信息 Oinone平台部署及依赖说明(v7.0) 未使用到的版本号请忽略,按项目中使用到的进行替换。 <!– 平台基础 –> <oinone-bom.version>7.0.5.1</oinone-bom.version> <!– 设计器 –> <pamirs.workflow.designer.version>7.0.0</pamirs.workflow.designer.version>…

    2025年12月17日
    61800
  • 7.3.2 原业务加审批流程

    场景说明 场景描述:全员营销标准产品的功能并未有任务发放的审批流,在实际执行中,当营销专员配置好任务后,需部门领导对整个活动如该任务内容、形式、参与人员进行审批。 业务需求:在发布任务这个流程中增加审批节点。 实战训练 Step1 原业务分析 点击菜单【任务中心】通过URL上的model参数找到对应模型编码为【gemini.biz.GeminiTaskProxy】 进入模型设计器主页面,应用选择【全员营销】、选择【系统模型】、通过搜索关键字【任务】选择【Gemini任务代理】,展示方式从图模式切换到表单模式,对比【模型编码】 但目前模型为代理模型,代理模型是用于代理存储模型的数据管理器能力,同时又可以扩展出非存储数据信息的交互功能的模型。因为在代理模型中新增的字段都是非存储字段,所以如果要增加【审核状态】的字段一定以要在存储模型增加。其父模型的查看有两种方式 表单模式下可以直接看父模型 在图模式和表单模式下点击继承关系 点击【Gemini任务】,进入【Gemini任务】的模型设计界面,可以看出该模型所在模块为【全员营销核心业务】,从【系统字段】中找到【任务状态】字段,点击查看字段详情,我们可以看到【业务类型】为数据字典,字典类型为【任务状态】。 在模型设计器的管理页面上方点击【数字字典】选项卡,模块选择为【全员营销核心业务】,选择【系统字典】就可以查看到【任务状态】数字字典 总结如下: 给【Gemini任务】模型增加一个【任务审批状态】,记录审批状态 在任务创建的时候,修改【任务状态】为【关闭】确保任务未审批通过的时,用户无法操作该任务。 审批通过后,恢复【任务状态】为【初始化】 我们先来整理下核心流程即:任务审批流程。 Step2 利用模型设计器设计模型 在模型设计器的管理页面上方点击【数字字典】选项卡,模块选择为【全员营销核心业务】,点击添加【数据字典】按钮,设置对应数据项 设置【字典名称】为【审批状态】 设置【字典项类型】为【文本】 通过【添加数据字典项】按钮增加对应数据字典项,如审核中、审核失败、审核成功 在模型设计器的管理页面上方点击【模型】选项卡,模块选择为【全员营销核心业务】,选择【系统模型】、搜索任务选择【Gemini任务】,点击添加字段 为模型【Gemini任务】添加字段 设置【字段名称】为【任务审批状态】 设置【字段业务类型】为数据字典,并选择关联数据字典为【任务审批状态】 最后点击【创建】按钮完成操作 回到【Gemini任务】设计区,我们可以看到在模型的【自定义字段】选项卡下方多了一个【任务审批状态】字段 Step3 利用界面设计器,设计出必要的审核页面 进入界面设计器,应用选择全员营销,模型选择【Gemini任务】,点击添加页面下的直接创建 设置页面标题、模型(自动带上可切换)、业务类型(运营管理后续会扩展其他类型)、视图类型(表单)后点击确认按钮进入【Gemini任务】表单设计页面 进入页面设计器,对【Gemini任务】表单页面进行设计(更多细节介绍,请参考界面设计产品使用手册) 左侧为物料区:分为组件、模型。 【组件】选项卡下为通用物料区,我们可以为页面增加对应布局、字段(如同在模型设计器增加字段)、动作、数据、多媒体等等 【模型】选项卡下为页面对应模型的自定义字段、系统字段、以及模型已有动作 中间是设计区域 右侧为属性面板,在设计区域选择中组件会显示对应组件的可配置参数 在左侧【组件】选项卡下,拖入布局组件【分组】,并设置组件【标题属性】为基础信息 在左侧【模型】选项卡下,分别系统字段中的【任务标题】、【任务开始时间】、【任务结束时间】、【视频标题】、【视频风格】、【任务描述】拖入【基础信息】分组,并点击【任务描述】,在右侧属性面板的【交互】分组中设置宽度为1。最后别忘了点击【发布】按钮完成页面的发布 Step4 通过流程设计器,设计对应业务流程 进入流程设计器,点击【创建】按钮 注意:流程中需要获取【关系字段】的除关联字段(一般为ID)以外的字段需要通过【数据获取】节点单独获取【关系字段】的对象数据。所以在流程设计中经常会用到【数据获取】节点 左上角编辑流程名称为【任务审批流程】,点击第一个【触发】节点,触发方式选择模型触发,模型选择【Gemini任务】,触发场景选择【新增或更新数据时】,【筛选条件】设置为【任务审批状态】为空或【任务审批状态】等于【审核中】,点击该节点的【保存】按钮 点击流程图节点间的【+】图标选择增加【获取数据】节点,或者拖动左侧物料区【获取数据】到特定的【+】图标 点击【获取数据】,在右侧属性面板中设置【获取数据条数】为多条,选择模型为【Gemini用户任务实例】,点击【筛选条件】的【{X}】图标,进行数据获取的条件设置 选择条件字段为【任务ID】条件操作符为【等于】,条件为变量的导购字段的ID。当上下文只有一个变量时默认不需要选择,这里默认的是【模型触发:[Gemini任务]】,设置好以后点击确认,回到属性面板设置【未获取到数据时执行方式】为【终止流程】,并点击节点【保持】按钮 增加【更新数据】节点,在右侧属性面板中 【更新模型】选择【模型触发:[Gemini任务]】 【字段列表】点击【创建】按钮 字段选择 更新【任务状态】字段 表达式设置为:【已关闭】。 【字段列表】点击【创建】按钮 字段选择 更新【任务审核状态】字段 表达式设置为:【审核中】。 最终完成的【模型触发:[Gemini任务]】更新设置 a. 【模型触发:[Gemini任务]】的【任务状态】字段等于数字字典的【已关闭】,任务审核状态为【审核中】 b. 最后点击节点【保持】按钮。 再增加【更新数据】节点,在右侧属性面板中 【更新模型】选择【获取数据[Gemini用户任务实例]】 【字段列表】点击【创建】按钮 字段选择 更新【任务状态】字段 表达式设置为:【已关闭】。 最终完成的【获取数据[Gemini用户任务实例]】更新设置 a. 【获取数据[Gemini用户任务实例]】的【任务状态】字段等于数字字典的【已关闭】 b. 最后点击节点【保持】按钮。 增加【审批】节点,在右侧属性面板中 【审批模型】选择模型为【模型触发:[Gemini任务]】 【选择视图】选择前面新建的页面【流程中的任务编辑页】 【审批人】选择角色为【超级管理员】 【数据】权限全部设置为【查看】 其他配置项默认,需要了解更多请查看产品使用手册 最后点击节点【保持】按钮。 新增【审核分支】,在【通过】分支中增加两个数据更新节点,跟审核前的两个数据更新节点对应 【模型触发:[Gemini任务]】的【任务状态】字段等于数字字典的【初始化】,任务审核状态为【审核通过】 【获取数据[Gemini用户任务实例]】的【任务状态】字段等于数字字典的【初始化】 流程确保保持并发布过,点击右上角【发布流程】完成流程的保存与发布 Step5 检验效果 创建任务后,任务状态为【关闭】状态,任务列表中的任务状态为多个状态的计算值 审核通过后,任务状态为【进行中】状态,任务列表中的任务状态为多个状态的计算值

    2024年5月23日
    1.1K00
  • oio-modal 对话框

    API 参数 说明 类型 默认值 版本 cancelText 取消按钮文字 string| slot 取消 closable 是否显示右上角的关闭按钮 boolean true closeIcon 自定义关闭图标 VNode | slot – confirmLoading 确定按钮 loading boolean 无 destroyOnClose 关闭时销毁 Modal 里的子元素 boolean false footer 底部内容,当不需要默认底部按钮时,可以设为 :footerInvisible="true" slot 确定取消按钮 getTriggerContainer 指定 Modal 挂载的 HTML 节点 (instance): HTMLElement () => document.body keyboard 是否支持键盘 esc 关闭 boolean true mask 是否展示遮罩 boolean true maskClosable 点击蒙层是否允许关闭 boolean true enterText 确认按钮文字 string 确定 title 标题 string|slot 无 visible(v-model:visible) 对话框是否可见 boolean 无 width 宽度 string|number 520 wrapClassName 对话框外层容器的类名 string – zIndex 设置 Modal 的 z-index number 1000 cancelCallback 点击遮罩层或右上角叉或取消按钮的回调, return true则关闭弹窗 function(e) enterCallback 点击确定回调 function(e)

    2023年12月18日
    1.4K00
  • 4.7.3版本升级说明-20240115

    版本号:4.7.x发布日期:2024.01.15更新要点:提高多语言翻译功能/改进工作流执行参数的转换逻辑/解决上个版本中存在的问题 ,请及时更新。 4.7.x版本 升级内容说明 增强国际化翻译能力 优化工作流执行参数转化逻辑 协同开发的支持,使用参考:https://doc.oinone.top/backend/4821.html 4.6.x所有的优化点 平台jar包版本 <!–平台基础jar包–> <pamirs.middleware.version>4.7.0</pamirs.middleware.version> <pamirs.k2.version>4.7.3.1</pamirs.k2.version> <pamirs.boot.version>4.7.7.3</pamirs.boot.version> <pamirs.framework.version>4.7.5.2</pamirs.framework.version> <pamirs.core.version>4.7.7.2</pamirs.core.version> <pamirs.distribution.version>4.7.4.1</pamirs.distribution.version> <pamirs.metadata.manager>4.7.3</pamirs.metadata.manager> <pamirs.lowcode.version>4.7.0</pamirs.lowcode.version> <!–设计器jar包–> <pamirs.designer.common.version>4.7.2</pamirs.designer.common.version> <pamirs.workflow.version>4.7.6.6</pamirs.workflow.version> <pamirs.flow.designer.base.version>4.7.3</pamirs.flow.designer.base.version> <pamirs.dataflow.designer.version>4.7.0</pamirs.dataflow.designer.version> <pamirs.workflow.designer.version>4.7.2</pamirs.workflow.designer.version> <pamirs.workbench.version>4.7.1</pamirs.workbench.version> <pamirs.model.designer.version>4.7.1</pamirs.model.designer.version> <pamirs.ui.designer.version>4.7.4</pamirs.ui.designer.version> <pamirs.data.designer.version>4.7.0</pamirs.data.designer.version> <pamirs.data.visualization.version>4.7.1</pamirs.data.visualization.version> <pamirs.eip.designer.version>4.7.0</pamirs.eip.designer.version> docker镜像版本 harbor.oinone.top/oinone/designer:4.7.10.4-allinone-mini 仅包含前后端工程harbor.oinone.top/oinone/designer-backend:latest 仅包含后端工程 RSQL相关的几个Java类路径调整 pro.shushi.pamirs.core.common.rsql.RSQLHelper; pro.shushi.pamirs.core.common.rsql.RSQLNodeInfo; pro.shushi.pamirs.core.common.rsql.connector.RSQLNodeConnector; pro.shushi.pamirs.core.common.entry.TreeNode; 替换为: pro.shushi.pamirs.framework.gateways.rsql.RSQLHelper; pro.shushi.pamirs.framework.gateways.rsql.RSQLNodeInfo; pro.shushi.pamirs.framework.gateways.rsql.connector.RSQLNodeConnector; pro.shushi.pamirs.framework.common.entry.TreeNode; 工作流回调钩子 注: 新版业务数据存在不兼容老版的情况,老版工作流流程数据运行完成之后升级新版 原有业务中使用工作流 fallBack、recall、 reject 钩子,函数接收String字符串后转换成对象简化。 @Function(summary = "回调方法") @Function.Advanced(displayName = "回调方法") public 业务模型 fallBack/recall/reject(String data) { 业务模型 proxy = JsonUtils.parseObject(data, new TypeReference<业务模型>(){}); // … 业务操作 return proxy; } 如果您有任何问题、建议或反馈,请随时联系我们。为了获得最佳体验,请升级至最新版本。我们将继续努力改进产品,提供更好的服务。谢谢!

    2023年12月1日
    1.1K00
  • 前端发布接入jenkins

    最原始的前端发布,会经过本地打包、压个 zip 包、通过工具手动上传、找到 leader 帮忙解压到对应的服务器上、同步文件服务器等等的步骤。每一个环节都是人工操作,发个版非常的繁琐。接入jenkins有助于我们简化CI/CD流程,实现前端发布自动化。 1. jenkins 安装部署(docker) 1-1 前置条件 安装 git、docker、配置 ssh git 安装 # enter 到底 yum install -y git # 查看git版本号 验证git安装成功 # git version 1.8.3.1 git –version docker 安装 # docker-ce Docker社区版 # docker-ce-cli Docker命令行界面(CLI) # containerd.io Docker插件,直接调用 Docker Compose # docker-compose-plugin Docker插件,直接调用 Docker Compose yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin 配置 ssh # Enter到底,最终会生成以下文件 # /root/.ssh/authorized_keys 允许无密码登录的公钥列表 # /root/.ssh/id_rsa 私钥文件 # /root/.ssh/id_rsa.pub 公钥文件 注意该文件里的内容是接下来要用的 ssh-keygen -t rsa -C "root" # 复制公钥文件的内容,添加到GitHub 的 SSH keys 或 任意其他远程仓库 vim /root/.ssh/id_rsa.pub 1-2 jenkins 安装 docker 拉取镜像 # 拉取nginx docker pull nginx # 拉取jenkins docker pull jenkins/jenkins:lts # 查看镜像是否安装成功 docker images # REPOSITORY TAG IMAGE ID CREATED SIZE # jenkins/jenkins lts 6a44d1dd2d60 3 weeks ago 468MB # nginx latest 53a18edff809 7 weeks ago 192MB 创建 docker 相关目录 # 创建docker的相关目录 mkdir -p ./docker/{compose,jenkins_home,nginx/conf,html/origin/{master,dev}} # 创建docker-compose.yml配置文件 cd ./docker/compose # 具体配置内容见下面 touch docker-compose.yml # 创建nginx.conf配置文件 cd ./docker/nginx/conf # 具体配置内容见下面 touch nginx.conf 最终目录结构如下 ./docker/ ├── compose/ │ └── docker-compose.yml # 空的 docker-compose 配置文件 └── html/ └── origin/ ├── master/ # 预留的 master 版本 HTML 目录(为空) └── dev/ # 预留的 dev 版本 HTML…

    2025年5月12日
    53800

Leave a Reply

登录后才能评论