深度分页问题优化方案

问题原因

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

相关推荐

  • 登录日志

    1. 登录日志 登录日志:记录企业成员/用户登录平台的历史明细,包括登录时间、位置、IP、登录设备、登录平台等信息,登录平台包括:PC Web、小程序、H5、APP。登录日志不需要通过审计规则订阅,平台会记录每位用户的登录日志。 操作支持导出、查看详情。

    2024年6月20日
    1.6K00
  • 4.7.8.6版本升级说明-20240506

    版本号: 4.7.8.6版本发布日期:2024.05.06更新要点:界面设计器新增生成默认视图功能 4.7.8.6版本 升级内容 界面设计器新增生成默认视图功能 修复函数openLevel错误的问题 修复操作日志字段显示名称超长的问题 修复操作日志无法正确保存关联关系字段的问题 修复工作流保存节点生成描述超长的问题 重要提示:此版本的业务工程和设计器版本必须统一升级至该版本及以上版本。 版本包信息 未使用到的版本号请忽略,按项目中使用到的进行替换 <!–平台基础jar包–> <pamirs.middleware.version>4.7.8.3</pamirs.middleware.version> <pamirs.k2.version>4.7.8.3</pamirs.k2.version> <pamirs.boot.version>4.7.8.6</pamirs.boot.version> <pamirs.framework.version>4.7.8.7</pamirs.framework.version> <pamirs.core.version>4.7.8.7</pamirs.core.version> <pamirs.distribution.version>4.7.8.3</pamirs.distribution.version> <pamirs.metadata.manager>4.7.8</pamirs.metadata.manager> <pamirs.lowcode.version>4.7.8</pamirs.lowcode.version> <!–设计器jar包–> <pamirs.designer.common.version>4.7.8</pamirs.designer.common.version> <pamirs.workflow.version>4.7.8.3</pamirs.workflow.version> <pamirs.flow.designer.base.version>4.7.8</pamirs.flow.designer.base.version> <pamirs.dataflow.designer.version>4.7.8</pamirs.dataflow.designer.version> <pamirs.workflow.designer.version>4.7.8</pamirs.workflow.designer.version> <pamirs.workbench.version>4.7.8</pamirs.workbench.version> <pamirs.model.designer.version>4.7.8</pamirs.model.designer.version> <pamirs.ui.designer.version>4.7.8.6</pamirs.ui.designer.version> <pamirs.data.designer.version>4.7.8</pamirs.data.designer.version> <pamirs.data.visualization.version>4.7.8</pamirs.data.visualization.version> <pamirs.eip.designer.version>4.7.8</pamirs.eip.designer.version> docker pull harbor.oinone.top/oinone/designer:4.8.2.3-allinone-fulldocker pull harbor.oinone.top/oinone/designer:4.8.2.3-allinone-mini 如果您有任何问题、建议或反馈,请随时联系我们。为了获得最佳体验,请及时更新至最新版本。我们将继续努力改进产品,提供更好的服务。谢谢!

    2024年5月6日
    1.7K00
  • 【工作流】如何自定义支持在加签的同时审批同意

    1.添加工作流相关依赖 业务的api工程添加工作流相关依赖 package pro.shushi.pamirs.demo.api; import org.springframework.stereotype.Component; import pro.shushi.pamirs.core.common.CommonModule; import pro.shushi.pamirs.file.api.FileModule; import pro.shushi.pamirs.meta.annotation.Module; import pro.shushi.pamirs.meta.base.PamirsModule; import pro.shushi.pamirs.meta.common.constants.ModuleConstants; import pro.shushi.pamirs.user.api.UserModule; import pro.shushi.pamirs.workflow.app.api.WorkflowModule; @Component @Module( name = DemoModule.MODULE_NAME, displayName = "oinoneDemo工程", version = "1.0.0", priority = 1, dependencies = {ModuleConstants.MODULE_BASE, CommonModule.MODULE_MODULE, UserModule.MODULE_MODULE, // 此处新增工作流依赖 WorkflowModule.MODULE_MODULE, FileModule.MODULE_MODULE } ) @Module.module(DemoModule.MODULE_MODULE) @Module.Advanced(selfBuilt = true, application = true) public class DemoModule implements PamirsModule { public static final String MODULE_MODULE = "demo_core"; public static final String MODULE_NAME = "DemoCore"; @Override public String[] packagePrefix() { return new String[]{ "pro.shushi.pamirs.demo" }; } } 业务的core工程添加工作流相关依赖 <dependency> <groupId>pro.shushi.pamirs.workflow</groupId> <artifactId>pamirs-workflow-api</artifactId> </dependency> <dependency> <groupId>pro.shushi.pamirs.workflow</groupId> <artifactId>pamirs-workflow-core</artifactId> </dependency> 2.自定义action动作,在一个动作内分别执行工作流应用自带的加签和审核同意动作 package pro.shushi.pamirs.demo.core.action; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import pro.shushi.pamirs.meta.annotation.Action; import pro.shushi.pamirs.meta.annotation.Model; import pro.shushi.pamirs.meta.enmu.ActionContextTypeEnum; import pro.shushi.pamirs.meta.enmu.ViewTypeEnum; import pro.shushi.pamirs.workflow.app.api.model.WorkflowTaskInstance; import pro.shushi.pamirs.workflow.app.api.model.WorkflowUserTask; import pro.shushi.pamirs.workflow.app.core.action.WorkflowUserTaskAction; import pro.shushi.pamirs.framework.common.utils.ObjectUtils; @Component @Model.model(WorkflowUserTask.MODEL_MODEL) public class DemoWorkflowUserTaskAction { @Autowired private WorkflowUserTaskAction workflowUserTaskAction; @Transactional(rollbackFor = {Exception.class}) @Action(displayName = "加签并审核同意", bindingType = ViewTypeEnum.FORM, contextType = ActionContextTypeEnum.SINGLE) public WorkflowUserTask approveAddsignAgree(WorkflowUserTask workflowUserTask) throws Throwable { WorkflowUserTask addsignRes = workflowUserTaskAction.approveAddsign(ObjectUtils.clone(workflowUserTask)); WorkflowTaskInstance updateTaskInstance = new WorkflowTaskInstance(); updateTaskInstance.setId(addsignRes.getTaskId()); updateTaskInstance.setLocked(false); updateTaskInstance.updateById(); WorkflowUserTask res = workflowUserTaskAction.approveAgree(ObjectUtils.clone(workflowUserTask)); return res; } } 3.自定义加签的view视图文件workflow_signature_form.xml,放到src/resources目录下,从数据库复制出工作流加签页面原有的视图,将里面的加签动作替换为上面自定义的新动作approveAddsignAgree <view widget="form"> <template slot="actions"> <action name="internalGotoListTableRouter" priority="0" label="返回" actionType="CLIENT" fun="$$internal_GotoListTableRouter" type="default"/> <action…

    2024年6月6日
    1.7K00
  • 3.5.x版本更新说明-20230201

    版本号:3.5.x发布日期:2023.02.01更新要点:前端发布内容包括导入/导出弹窗按钮支持、弹出层按钮传参支持、界面设计器移除表格视图原有导入导出按钮。后端发布内容包括导入导出按钮变更为跳转动作、增加校验模块依赖、页面设计器按钮交互变更、页面设计器跳转动作增加模块依赖校验、模型设计器修复分布式元数据可能导致的NPE问题。这些更新将提升系统功能性和用户体验。 1 发布概要 1.1 前端 发布内容: 导入/导出弹窗中相关按钮支持(下载模板,导入,导出) 弹出层按钮支持context传参(目前仅支持弹窗中为表单视图) 界面设计器默认移除表格视图原有的导入导出按钮 1.2 后端 发布内容: 导入导出按钮 从客户端动作变更为跳转动作 自动生成时导入导出按钮时,增加校验模块依赖。(模型所在模块依赖文件模块,才生成) 页面设计器导入导出按钮交互变更,从开关变更为元数据拖拽 页面设计器创建跳转动作,增加模块依赖校验 (当前设计的模块,必须依赖模型所在的模块)页面设计器内置跳转动作,增加模块依赖校验,设计的模型不依赖对应模块则不出现内置元数据。(模型依赖文件模块,才能看到导入导出按钮) 模型设计器 分布式元数据,修复去掉系统模型可能导致的NPE问题 2.版本信息 <pamirs.middleware.version>3.5.7</pamirs.middleware.version> <pamirs.boot.version>3.5.7</pamirs.boot.version> <pamirs.framework.version>3.5.7</pamirs.framework.version> <pamirs.k2.version>3.5.7</pamirs.k2.version> <pamirs.core.version>3.5.7</pamirs.core.version> <pamirs.tenant.version>3.5.7</pamirs.tenant.version> <pamirs.lowcode.version>3.5.7</pamirs.lowcode.version> <pamirs.designer.version>3.5.7</pamirs.designer.version> <pamirs.workflow.designer.version>3.5.7</pamirs.workflow.designer.version> <pamirs.workflow.version>3.5.7</pamirs.workflow.version> <pamirs.workbench.version>3.5.7</pamirs.workbench.version> <pamirs.designer.common.version>3.5.7</pamirs.designer.common.version> <pamirs.model.designer.version>3.5.7</pamirs.model.designer.version> <pamirs.logic.designer.version>3.5.7</pamirs.logic.designer.version> <pamirs.ui.designer.version>3.5.7</pamirs.ui.designer.version> <pamirs.data.designer.version>3.5.7</pamirs.data.designer.version> <pamirs.data.visualization.version>3.5.7</pamirs.data.visualization.version> <pamirs.distribution.version>3.5.7</pamirs.distribution.version> <pamirs.welcome.version>3.5.7</pamirs.welcome.version> <pamirs.gemini.version>3.5.7</pamirs.gemini.version> <pamirs.paas.version>3.5.7</pamirs.paas.version> 如果您有任何问题、建议或反馈,请随时联系我们。为了获得最佳体验,建议请升级至最新版本。我们将继续努力改进产品,提供更好的服务。谢谢您的支持!

    2023年2月1日
    1.3K00
  • 自定义createorupdate方法时,关联模型数据怎么保存?

    需要自己手动增加保存关联模型数据的逻辑。 多对一、一对一以及一对多 可直接用fieldSave进行保存即可 //如 data.fieldSave(PamirsEmployee::getPositions); 多对多 需要对数据进行处理,前端提交过来的数据,进行判断,是新增还是修改,或者删除

    2023年11月1日
    1.8K00

Leave a Reply

Please Login to Comment