深度分页问题优化方案

问题原因

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低代码应用平台体验

Like (0)
's avatar
Previous 2023年6月20日 pm4:07
Next 2023年11月2日 pm1:58

相关推荐

  • 4.2.1 组件之生命周期

    组件生命周期的意义所在:比如动态创建了「视图、字段」,等它们初始化完成或者发生了修改后要执行业务逻辑,这个时候只能去自定义当前字段或者视图,体验极差,平台应该提供一些列的生命周期,允许其他人调用生命周期的api去执行对应的逻辑。 一、实现原理 图4-2-1-1 实现原理 当用户通过内部API去监听某个生命周期的时候,内部会动态的去创建该生命周期,每个生命周期都有「唯一标识」,内部会根据「唯一标识」去创建对应的「Effect」,Effect会根据生命周期的「唯一标识」实例化一个「lifeCycle」,「lifeCycle」创建完成后,会被存放到「Heart」中,「Heart」是整个生命周期的心脏,当心脏每次跳动的时候(生命周期被监听触发)都会触发对应的生命周期 二、生命周期API API 描述 返回值 View LifeCycle onViewBeforeCreated 视图创建前 ViewWidget onViewCreated 视图创建后 ViewWidget onViewBeforeMount 视图挂载前 ViewWidget onViewMounted 视图挂载后 ViewWidget onViewBeforeUpdate 视图数据发生修改前 ViewWidget onViewUpdated 视图数据修改后 ViewWidget onViewBeforeUnmount 视图销毁前 ViewWidget onViewUnmounted 视图销毁 ViewWidget onViewSubmit 提交数据 ViewWidget onViewSubmitStart 数据开始提交 ViewWidget onViewSubmitSuccess 数据提交成功 ViewWidget onViewSubmitFailed 数据提交失败 ViewWidget onViewSubmitEnd 数据提交结束 ViewWidget onViewValidateStart 视图字段校验 ViewWidget onViewValidateSuccess 校验成功 ViewWidget onViewValidateFailed 校验失败 ViewWidget onViewValidateEnd 校验结束 ViewWidget Field LifeCycle onFieldBeforeCreated 字段创建前 FieldWidget onFieldCreated 字段创建后 FieldWidget onFieldBeforeMount 字段挂载前 FieldWidget onFieldMounted 字段挂载后 FieldWidget onFieldBeforeUpdate 字段数据发生修改前 FieldWidget onFieldUpdated 字段数据修改后 FieldWidget onFieldBeforeUnmount 字段销毁前 FieldWidget onFieldUnmounted 字段销毁 FieldWidget onFieldFocus 字段聚焦 FieldWidget onFieldChange 字段的值发生了变化 FieldWidget onFieldBlur 字段失焦 FieldWidget onFieldValidateStart 字段开始校验 FieldWidget onFieldValidateSuccess 校验成功 FieldWidget onFieldValidateFailed 校验失败 FieldWidget onFieldValidateEnd 校验结束 FieldWidget 表4-2-1-1 生命周期API 上面列出的分别是「视图、字段」的生命周期,目前Action的生命周期还没有,后续再补充。 三、第一个View组件生命周期的监听(举例) Step1 新建registryLifeCycle.ts 新建registryLifeCycle.ts,监听宠物达人的列表页。’宠物达人table_demo_core’为视图名,您需要找后端配合 import { onViewCreated } from '@kunlun/dependencies' function registryLifeCycle(){ onViewCreated('宠物达人table_demo_core', (viewWidget) => { console.log('宠物达人table_demo_core'); console.log(viewWidget); }); } export {registryLifeCycle} 图4-2-1-2 新建registryLifeCycle.ts Step2 修改main.ts 全局注册lifeCycle import { registryLifeCycle } from './registryLifeCycle'; registryLifeCycle(); 图4-2-1-3 修改main.ts Step3 看效果 图4-2-1-4 示例效果 四、第一个Filed组件生命周期的监听(举例) Step1 修改registryLifeCycle.ts 通过onFieldValueChange增加宠物达人搜索视图的name(达人)字段的值变化进行监听。 宠物达人search:name 代表 视图名:字段名 import { onViewCreated , onFieldValueChange} from '@kunlun/dependencies' function registryLifeCycle(){ onViewCreated('宠物达人table_demo_core', (viewWidget) => { console.log('宠物达人table_demo_core'); console.log(viewWidget); }); onFieldValueChange('宠物达人search:name', (filedWidget) => { console.log('宠物达人search:name');…

    Oinone 7天入门到精通 2024年5月23日
    1.3K00
  • 接口日志内容记录频率限制功能说明

    为有效避免接口调用日志记录占用过多存储空间,从而减少对数据库资源的消耗,自5.2.0之后的版本,对于成功请求的集成接口与开放接口,其日志将不再进行完整记录。请求及响应参数将依据默认的千分之一概率进行选择性完整记录。 修改日志完整记录频率 日志完整记录频率默认0.01,即千分之一。 取值范围0~1,0为完全不记录,1为100%记录。 pamirs: eip: log: frequency: 0.01 临时开启某接口日志完整记录 在“集成接口”应用中,可临时针对某一接口开启完整日志记录功能,此功能适用于集成接口与开放接口。 在“集成设计器”中也支持此功能。 注意事项 请求失败的接口不会受到配置的影响,日志内容将被完整记录。

    2024年10月8日
    1.2K00
  • 文件上传组件前端校验超128长度大小,不清楚怎么配置

    原因是拼上后端返回的文件全路径后超出了字段的存储长度,后端通过注解@Field.String(size=1024)修改字段的存储长度后重新运行一遍服务。

    2023年11月1日
    2.0K00
  • 自定义页面问题

    2022年2月10日
    1.6K00
  • 正式版发布:Oinone 7.2.0 版本 支持国际版,自由选购,邀您体验

    版本号: 7.2.0 版本发布日期:2026.03更新要点:Oinone 国际版 7.2.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 升级说明及步骤 20260903 升级内容 前端镜像版本升级: 7.2.9 –> 7.2.10 后端镜像版本升级: 7.2.11 –> 7.2.12 前端版本升级 后端版本升级: 7.2.10 –> 7.2.11 回调等待节点布尔条件控件(callbackWaitBooleanConditionControl) 审批人「分组对象」选择 UI,与后端 WorkflowGroupObjectAction#queryOne 对齐 JsonParamParser 数组入参解析赋值表达式修复(原 dev/wx/eip_20260721) 流程实例增加流程全景 Tab(WorkflowPanorama,四态展示:未到达/已退回/已办/在办) 我的待办增加打标(单条/批量) 我的待办增加批量同意/拒绝/加签/转办(受「允许快捷审批」节点约束) 批量补充提示(batchSupplementTip HTML 只读展示,默认折叠) 催办指定人员弹窗(或签默认单人、会签全选不可取消) 我的评论 / @员工 组件增强 员工显示格式:名称-工号 运行时待办页批量 DSL、表格勾选交互优化 设计器节点面板注册 CALLBACK_WAIT(接口回调等待)节点 委托表单分组选择组件(FormWorkflowGroupSelectFieldWidget,queryOne 后查业务模型) 图标上传隐藏文件导致上传失败修复 placeHolder 增加 displayName 用户名显示为「编号-名称」形式(配合前端 personDisplay) 数据库连接支持多 IP 的 HA 模式 低版本 MariaDB 重复执行 DDL 优化 模型变动导致草稿加载失败优化 模型变动/删除字段导致业务审计报错优化 增加 i18n 翻译项(含流程跳转等) RolePlaceHolderParser 修复 SSO 文档更新 协同模式下扩展点过滤问题修复 Excel 导出扩展点问题修复 新建连接器:服务器地址不允许输入 http/https 提示 API 创建/编辑:参数字符串数组赋值表达式错误修复 pamirs-metadata-manager 补充文档 pamirs-model-designer 修改日志输出 修复打印设计器、界面设计器多人协同时报错问题 回调等待节点(notify 按条件恢复、nodeBizFlag 唯一标识、人工干预、timeoutFun 超时兜底) 流程触发 SPI(WorkflowInstanceTriggerApi.afterTriggered) 节点 endFun / agree 钩子 / nodeBizFlag / customApprovalName 审批角色 + 分组执行人 SPI(WorkflowGroupUserApi) 流程全景预估(WorkflowPanoramaManager) 改单重提 / 复制发起 / 原地重启 rerunInPlace 流程跳转(监控中心 jump,同主干人工节点) 打标 / 批量同意拒绝加签转办 / 评论 SPI / 流程与节点暂停 委托(按流程/节点/分组 + groupCode + 日期范围) 离职审批交接(查待办/预览/转办/主数据替换 + 通知 SPI) 催办指定人员(urgeSelected + urge 钩子) 工作流:groupCode 分组委托、batchSupplementTip 钩子、rerunInPlace 原地重启 回调等待节点设计器(CallbackWaitNodeExtPoint、表单/详情 XML) 各节点 nodeBizFlag 业务标识表单 审批/填写节点 endFun 兜底扩展配置 设计器校验与导出辅助 应用中心 流程设计器增加筛选导出入口 20260820 升级内容 前端镜像版本升级: 7.2.8 –> 7.2.9 后端镜像版本升级: 7.2.10 –> 7.2.11 前端版本升级 后端版本升级: 7.2.9 –> 7.2.10 工作流-监控中心的流程实例支持切换节点查看节点信息 修复界面设计器的日期时间范围组件在没有设置格式化的情况下无法正常发布 界面设计器的客户端动作支持上下文配置,便于二次开发 详情页面部分字段组件支持配置点击动作…

    2026年3月31日
    1.4K00

Leave a Reply

Please Login to Comment