深度分页问题优化方案

问题原因

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

相关推荐

  • 3.3.3 模型的数据管理器

    数据管理器和数据构造器是Oinone为模型自动赋予的Function是内在数据管理能力,数据管理器针对存储模型是方便在大家编程模式下可以利用数据管理器Function快速达到相关数据操作的目的。数据构造器则主要用于模型进行初始化时字段默认值计算和页面交互 数据管理器 只有存储模型才有数据管理器。如果@Model.Advanced注解设置了dataManager属性为false,则表示在UI层不开放默认数据管理器。开放级别为API则表示UI层可以通过HTTP请求利用4.1.15【Pamirs标准网关协议】进行数据交互。 模型默认数据读管理器 函数编码 描述 开放级别 queryByPk 根据主键查询单条记录,会进行主键值检查 Local、Remote queryByEntity 根据实体查询单条记录 Local、Remote、Api queryByWrapper 根据查询类查询单条记录 Local、Remote queryListByEntity 根据实体查询返回记录列表 Local、Remote queryListByWrapper 根据查询类查询记录列表 Local、Remote queryListByPage 根据实体分页查询返回记录列表 Local、Remote queryListByPageAndWrapper 根据查询类分页查询记录列表 Local、Remote queryPage 分页查询返回分页对象,分页对象中包含记录列表 Local、Remote、Api countByEntity 按实体条件获取记录数量 Local、Remote countByWrapper 按查询类条件获取记录数量 Local、Remote 表3-3-3-1 模型默认数据读管理器 模型默认数据写管理器 函数编码 描述 开放级别 createOne 提交新增单条记录 Local、Remote createOrUpdate 新增或更新,需要为模型设置唯一索引,如果数据库检测到索引冲突,会更新数据,若未冲突则新增数据 Local、Remote updateByPk 根据主键更新单条记录,会进行主键值检查 Local、Remote updateByUniqueField 条件更新,条件中必须包含唯一索引字段 Local、Remote updateByEntity 按实体条件更新记录 Local、Remote、Api updateByWrapper 按查询类条件更新记录 Local、Remote createBatch 批量新增记录 Local、Remote createOrUpdateBatch 批量新增或更新记录 Local、Remote updateBatch 根据主键批量更新记录,会进行主键值检查 Local、Remote deleteByPk 根据主键删除单条记录,会进行主键值检查 Local、Remote deleteByPks 根据主键批量删除,会进行主键值检查 Local、Remote deleteByUniqueField 按条件删除记录,条件中必须包含唯一索引字段 Local、Remote deleteByEntity 根据实体条件删除 Local、Remote、Api deleteByWrapper 根据查询类条件删除 Local、Remote createWithField 新增实体记录并更新实体字段记录 Local、Remote、Api updateWithField 更新实体记录并更新实体字段记录 Local、Remote、Api deleteWithFieldBatch 批量删除实体记录并删除关联关系 Local、Remote、Api 表3-3-3-2 模型默认数据写管理器 如果模型继承IdModel,模型会自动设置主键设置为id,则会继承queryById、updateById和deleteById函数。 queryById(详情,根据ID查询单条记录,开放级别为Remote) updateById(提交更新单条记录,根据ID更新单条记录,开放级别为Remote) deleteById(提交删除单条记录,根据ID删除单条记录,开放级别为Remote) 如果模型继承CodeModel,模型也会继承IdModel的数据管理器,编码字段code为唯一索引字段。在新增数据时会根据编码生成规则自动设置编码字段code的值,继承queryByCode、updateByCode和deleteByCode函数。 queryByCode(详情,根据code查询单条记录,开放级别为Remote) updateByCode(提交更新单条记录,根据code更新单条记录,开放级别为Remote) deleteByCode(提交删除单条记录,根据code删除单条记录,开放级别为Remote) 没有主键或唯一索引的模型,在UI层不会开放默认数据写管理器。 #### 使用场景 图3-3-3-1 数据管理器使用场景 数据构造器 模型数据构造器 construct:供前端新开页面构造默认数据使用。所有模型都拥有construct构造器,默认会将字段上配置的默认值返回给前端,另外可以在子类中覆盖construct方法。数据构造器 construct函数的开放级别为API,函数类型为QUERY查询函数,系统将识别模型中的以construct命名的函数强制设置为API开放级别和QUERY查询类型。 可以使用@Field的defaultValue属性配置字段的默认值。注意,枚举的默认值为枚举的name。

    2024年5月23日
    2.6K10
  • OioNotification 通知提醒框

    全局展示通知提醒信息。 何时使用 在系统四个角显示通知提醒信息。经常用于以下情况: 较为复杂的通知内容。 带有交互的通知,给出用户下一步的行动点。 系统主动推送。 API OioNotification.success(title,message, config) OioNotification.error(title,message, config) OioNotification.info(title,message, config) OioNotification.warning(title,message, config) config 参数如下: 参数 说明 类型 默认值 版本 duration 默认 3 秒后自动关闭 number 3 class 自定义 CSS class string –

    2023年12月18日
    1.2K00
  • 后端学习路径

    准备工作 -1h 后端研发环境安装后端研发环境,需要idea和oinone插件,git和maven 设置指南为学习教程进行的一些准备 后端基础 1.1.1整体介绍 -0.5h– 模块(module)定义– 模块(Module)结构– Oinone版本 1.1.2 新建一个应用 -1.5h为创建一个全新的 Oinone 模块奠定基础。从零开始,仅使用让 Oinone 识别我们模块所需的最少元素。包括: — 新建费用管理模块– 定义Oinone的费用模块– 配置启动工程的YAML文件 1.1.3 模型与基础字段 -3h– 对象关系映射ORM– 模型基础字段 1.1.4 安全简介 -3h配置模型的菜单入口和对应角色的权限(访问权限和数据权限) — 菜单入口– 用户与角色– 访问权限配置 1.1.5 界面实操-3h通过配置字段的一些新属性和UX属性改变页面交互 –字段一些新属性–UX属性 1.1.6 基础视图-3h–表格视图–表单视图–详情视图 1.1.7 模型建关系-8h–多对一关系(many2one)–多对多关系(many2many)–一对多关系(one2many) 1.1.8 字段间联动-5h–关系字段属性:domain–UX的一些新属性,包括:compute、constructFun 1.1.9 准备学习行为-3h–单记录操作–批量操作 1.1.10 约束-1h–SQL约束–校验约束–UI交互约束 1.1.11 追加细节 -3h–内联视图–组件widget–表格排序 1.1.12 继承-2h–函数的重写–模型的继承 1.1.13 模块间相互作用-2h–link模块 1.1.14 产品的个性化开发-4h–模块的upstream属性–函数特性,包括扩展点、拦截器 后端进阶 2.1.1 调试工具-1hOinone 提供的调试工具是一款支持在浏览器页面直接进行 页面调试 与 接口调试 的效率工具。 2.1.2 界面设计器-4h界面设计器提供了直观的可视化界面,允许用户通过拖拽和配置组件的方式来构建应用界面,而无需依赖传统的手写大量代码的方式。这种设计器旨在简化界面开发过程,提高开发效率,同时确保界面的美观和易用性。

    2025年9月1日
    1.4K00
  • 4.1.9 函数之元位指令

    元位指令系统是通过给请求上下文的指令位字段作按位与标记来对函数处理下发对应指令的系统。 一、元位指令介绍 元位指令系统是通过给请求上下文的指令位字段作按位与标记来对函数处理下发对应指令的系统。 元位指令系统分为请求上下文指令和数据指令两种。 数据指令 数据指令基本都是系统内核指令。业务开发时用不到这里就不介绍了。前20位都是系统内核预留 请求上下文指令 请求上下文指令:使用session上下文中非持久化META_BIT属性设置指令。 位 指令 指令名 前端默认值 后端默认值 描述 20 builtAction 内建动作 否 否 是否是平台内置定义的服务器动作对应操作:PamirsSession.directive().disableBuiltAction(); PamirsSession.directive().enableBuiltAction(); 21 unlock 失效乐观锁 否 否 系统对带有乐观锁模型默认使用乐观锁对应操作:PamirsSession.directive().enableOptimisticLocker(); PamirsSession.directive().disableOptimisticLocker(); 22 check 数据校验 是 否 系统后端操作默认不进行数据校验,标记后生效数据校验对应操作:PamirsSession.directive().enableCheck(); PamirsSession.directive().disableCheck(); 23 defaultValue 默认值计算 是 否 是否自动填充默认值对应操作:PamirsSession.directive().enableDefaultValue(); PamirsSession.directive().disableDefaultValue(); 24 extPoint 执行扩展点 是 否 前端请求默认执行扩展点,可以标记忽略扩展点。后端编程式调用数据管理器默认不执行扩展点对应操作:PamirsSession.directive().enableExtPoint(); PamirsSession.directive().disableExtPoint(); 25 hook 拦截 是 否 是否进行函数调用拦截对应操作:PamirsSession.directive().enableHook(); PamirsSession.directive().disableHook(); 26 authenticate 鉴权 是 否 系统默认进行权限校验与过滤,标记后使用权限校验对应操作:PamirsSession.directive().sudo(); PamirsSession.directive().disableSudo(); 27 ormColumn ORM字段别名 否 否 系统指令,请勿设置 28 usePkStrategy 使用PK策略 是 否 使用PK是否空作为采用新增还是更新的持久化策略对应操作:PamirsSession.directive().enableUsePkStrategy(); PamirsSession.directive().disableUsePkStrategy(); 29 fromClient 是否客户端调用 是 否 是否客户端(前端)调用对应操作:PamirsSession.directive().enableFromClient(); PamirsSession.directive().disableFromClient(); 30 sync 同步执行函数 否 否 异步执行函数强制使用同步方式执行(仅对Spring Bean有效) 31 ignoreFunManagement 忽略函数管理 否 否 忽略函数管理器处理,防止Spring调用重复拦截对应操作:PamirsSession.directive().enableIgnoreFunManagement(); PamirsSession.directive().disableIgnoreFunManagement(); 表4-1-9-1 请求上下文指令 二、使用指令 普通模式 PamirsSession.directive().disableOptimisticLocker(); try{ 更新逻辑 } finally { PamirsSession.directive().enableOptimisticLocker(); } 图4-1-9-1 普通模式代码示意 批量设置模式 Models.directive().run(() -> {此处添加逻辑}, SystemDirectiveEnum.AUTHENTICATE) 图4-1-9-2 批量设置模式代码示意 三、使用举例 我们在4.1.5【模型之持久层配置】一文中提到过失效乐观锁,我们在这里就尝试下吧。 Step1 修改PetItemInventroyAction 手动失效乐观锁 package pro.shushi.pamirs.demo.core.action; import org.springframework.stereotype.Component; import pro.shushi.pamirs.demo.api.model.PetItemInventroy; import pro.shushi.pamirs.meta.annotation.Function; import pro.shushi.pamirs.meta.annotation.Model; import pro.shushi.pamirs.meta.api.session.PamirsSession; import pro.shushi.pamirs.meta.constant.FunctionConstants; import pro.shushi.pamirs.meta.enmu.FunctionOpenEnum; import pro.shushi.pamirs.meta.enmu.FunctionTypeEnum; import java.util.ArrayList; import java.util.List; @Model.model(PetItemInventroy.MODEL_MODEL) @Component public class PetItemInventroyAction { @Function.Advanced(type= FunctionTypeEnum.UPDATE) @Function.fun(FunctionConstants.update) @Function(openLevel = {FunctionOpenEnum.API}) public PetItemInventroy update(PetItemInventroy data){ List<PetItemInventroy> inventroys = new ArrayList<>(); inventroys.add(data); PamirsSession.directive().disableOptimisticLocker(); try{ //批量更新会,自动抛错 int i = data.updateBatch(inventroys); //单记录更新,不自动抛售需要自行判断 // int i = data.updateById();…

    2024年5月23日
    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 升级说明及步骤 20261021 升级内容 前端镜像版本升级: 7.2.12 –> 7.2.13 前端版本升级 表头设置弹窗对齐全局 popup 配置(拖拽/居中/遮罩等) 刷新后表格按用户偏好恢复列顺序 表头设置弹窗保留条件 invisible 字段(仅排除永久隐藏) 表格字段动作支持 TextArea / Enum / Boolean Select 20261017 升级内容 前端镜像版本升级: 7.2.11 –> 7.2.12 前端版本升级 表格编辑数字/公式后,本地表尾合计即时刷新 触发框搜索选中后正确回填,并保留筛选态 多页签 新窗口页面打开的表单页切回不再丢数据、不再多出空创建 tab 20261014 升级内容 前端镜像版本升级: 7.2.10 –> 7.2.11 前端版本升级 修复关系字段下拉关闭后搜索关键字与结果被清空 修复整表编辑尾部追加行后 M2O Select 不回显 修复全表编辑复制行未同步 dataSource 导致删除异常 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 / 流程与节点暂停 委托(按流程/节点/分组…

    2026年3月31日
    1.7K00

Leave a Reply

Please Login to Comment