深度分页问题优化方案

问题原因

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

相关推荐

  • 平台基础服务

    模块 内容 目标 doc 链接 工作台 工作台处理流程 了解工作台用途和熟练查看、处理流程 应用中心 用户中心 创建用户 熟悉用户创建和其他用户相关操作 用户中心 权限 了解权限项 熟悉权限项设置 新版权限操作手册(5.0以上) 了解角色权限 熟悉角色权限操作 新版权限操作手册(5.0以上) 低无一体 上传jar包模式 熟悉上传jar包模式的低无一体操作 7.4 Oinone的低无一体 源码托管模式 熟悉源码托管模式的低无一体操作 7.4 Oinone的低无一体 合作伙伴中心 熟悉合作伙伴中心 创建部门、岗位、员工 合作伙伴中心 应用中心 了解应用中心 了解应用中心 应用中心 文件 了解导入导出产生的文件 了解导入导出产生的文件 文件 翻译 了解如何进行翻译 了解如何进行翻译 翻译 工作流 熟悉工作流程的查看、操作 熟悉工作流程的查看、操作 工作流

    2024年6月15日
    1.5K00
  • 开发者

    1.开发者 1.1 Webhook 通过webhook流程节点可以向第三方系统发送请求。 1.1.1 请求方式 支持GET、POST两种请求方式。 1.1.2 URL 在Webhook URL中填写发送请求的HTTP地址。 1.1.3 Headers&Body Headers的value支持通过表达式配置变量 Body的数据类型支持KEY_VALUE和APPLICATION_JSON两种。

    2024年6月20日
    2.1K00
  • 5.2.0版本bugfix:修复日期格式未根据语言配置转换的问题,请升级对应版本

    版本号: 5.2.18 版本发布日期:2024.12.25更新要点:修复日期格式未根据语言配置转换的问题 5.2.0 版本 升级说明及步骤(已升级为5.0.0版本忽略) 此版本与4.7.8版本的兼容方案如下,请严格参照升级说明及步骤进行1、【重要】升级前备份base库和用户权限模块所在的库 2、【重要】升级过程执行SQL严格按照升级文档中的步骤执行。特别注意:部分SQL是要求【发布前执行】,部分SQL是要求【发布后执行】 5.0.0升级详细说明及步骤 升级内容(5.2.0) 修复日期格式未根据语言配置转换的问题(管理中心/工作流) 修复SQLRecord在一个事务中Insert和Update修改同一条数据的问题 修复流程设计器请求的模块名称错误的问题 修复界面设计器表格日期字段展示了时间、表格时间字段展示了日期 修复数据权限中的表达式使用源码模式后页面卡死的问题 修复工作流自定义抄送人 修复MQ未正确处理PamirsSession的问题 请尽可能保证业务工程前后端服务以及设计器同步升级前端服务仅需重新执行npm install即可自动升级到最新版本 后端版本包信息 Oinone平台部署及依赖说明(v5.0) 未使用到的版本号请忽略,按项目中使用到的进行替换。 <!– 平台基础 –> <oinone.version>5.2.18.2</oinone.version> <!– 设计器 –> <pamirs.workflow.designer.version>5.2.0</pamirs.workflow.designer.version> <pamirs.model.designer.version>5.2.9</pamirs.model.designer.version> <pamirs.ui.designer.version>5.2.14</pamirs.ui.designer.version> <pamirs.data.designer.version>5.2.5</pamirs.data.designer.version> <pamirs.dataflow.designer.version>5.2.0</pamirs.dataflow.designer.version> <pamirs.eip.designer.version>5.2.6</pamirs.eip.designer.version> <dependencyManagement> <dependencies> <dependency> <groupId>pro.shushi</groupId> <artifactId>oinone-bom</artifactId> <version>${oinone.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> oinone-bom详细版本信息 <!– 平台基础 –> <pamirs.middleware.version>5.2.3</pamirs.middleware.version> <pamirs.k2.version>5.2.11</pamirs.k2.version> <pamirs.framework.version>5.2.16</pamirs.framework.version> <pamirs.boot.version>5.2.16</pamirs.boot.version> <pamirs.distribution.version>5.2.7</pamirs.distribution.version> <!– 平台功能 –> <pamirs.metadata.manager>5.2.2</pamirs.metadata.manager> <pamirs.designer.metadata.version>5.2.3</pamirs.designer.metadata.version> <pamirs.core.version>5.2.23</pamirs.core.version> <pamirs.workflow.version>5.2.10</pamirs.workflow.version> <pamirs.workbench.version>5.2.0</pamirs.workbench.version> <pamirs.data.visualization.version>5.2.7</pamirs.data.visualization.version> <!– 设计器 –> <pamirs.designer.common.version>5.2.3</pamirs.designer.common.version> <pamirs.flow.designer.base.version>5.2.7</pamirs.flow.designer.base.version> 前端版本包信息 { "@kunlun/vue-dependencies": "5.2.32", "@kunlun/vue-ui-antd": "5.2.32", "@kunlun/vue-ui-el": "5.2.32", "@kunlun/vue-mobile-dependencies": "5.2.14", "@kunlun/vue-ui-mobile-vant": "5.2.14", "@kunlun/mobile-workbench": "5.2.5", "@kunlun/data-designer-open-pc": "5.2.1", "@kunlun/data-designer-open-mobile": "5.2.1" } 前端详细版本信息 可通过node_modules/@kunlun查看 { "@kunlun/cache": "5.2.9", "@kunlun/dsl": "5.2.9", "@kunlun/event": "5.2.9", "@kunlun/expression": "5.2.9", "@kunlun/meta": "5.2.9", "@kunlun/request": "5.2.9", "@kunlun/router": "5.2.9", "@kunlun/service": "5.2.9", "@kunlun/shared": "5.2.9", "@kunlun/spi": "5.2.9", "@kunlun/state": "5.2.9", "@kunlun/theme": "5.2.9", "@kunlun/engine": "5.2.12", "@kunlun/vue-admin-base": "5.2.32", "@kunlun/vue-admin-layout": "5.2.32", "@kunlun/vue-dependencies": "5.2.32", "@kunlun/vue-router": "5.2.32", "@kunlun/vue-ui": "5.2.32", "@kunlun/vue-ui-antd": "5.2.32", "@kunlun/vue-ui-common": "5.2.32", "@kunlun/vue-ui-el": "5.2.32", "@kunlun/vue-widget": "5.2.32", "@kunlun/vue-expression": "5.2.1", "@kunlun/vue-mobile-base": "5.2.14", "@kunlun/vue-mobile-dependencies": "5.2.14", "@kunlun/vue-ui-mobile-vant": "5.2.14", "@kunlun/mobile-workbench": "5.2.5", "@kunlun/data-designer-core": "5.2.1", "@kunlun/data-designer-core-mobile": "5.2.1", "@kunlun/data-designer-core-pc": "5.2.1", "@kunlun/data-designer-open-mobile": "5.2.1", "@kunlun/data-designer-open-pc": "5.2.1" } 镜像说明 所有镜像均使用docker manifest支持amd64和arm64架构。如镜像拉取过慢,可在对应镜像Tag添加-amd64、-arm64后缀获取单一架构镜像。 docker pull harbor.oinone.top/oinone/oinone-designer-full-v5.2:5.2.18.2-amd64 docker pull harbor.oinone.top/oinone/oinone-designer-full-v5.2:5.2.18.2-arm64 镜像拉取 镜像或JAR版本:5.2.18.2 体验镜像:(所有中间件及前后端服务,包含全部设计器) docker pull harbor.oinone.top/oinone/oinone-designer-full-v5.2:5.2.18.2 部署镜像:(包含前后端服务,包含全部设计器) docker pull harbor.oinone.top/oinone/oinone-designer-mini-v5.2:5.2.18.2 流程设计器镜像:(包含前后端服务,仅包含流程设计器) docker pull harbor.oinone.top/oinone/workflow-designer-v5.2:5.2.18.2 后端镜像:(仅包含后端服务,包含全部设计器)…

    2024年12月25日
    1.7K00
  • 工作流常见问题

    一、工作流引用及触发 1.项目中工作流引入和流程触发https://doc.oinone.top/backend/4361.html 2.【工作流】如何添加工作流运行时依赖https://doc.oinone.top/workflow/13144.html 3.工作流查看、处理流程https://doc.oinone.top/oio4/9388.html 二、 常见工作流功能应用及扩展 1.动态表单https://doc.oinone.top/designer/workflowdesigner/16336.html 2.【工作流】如何自定义支持在加签的同时审批同意https://doc.oinone.top/workflow/13505.html 3.【工作流】如何自定义工作流的待办任务列表https://doc.oinone.top/workflow/6989.html 4.【工作流】如何在业务模型的列表中展示工作流的审批按钮https://doc.oinone.top/workflow/6987.html 5.【工作流】流程扩展自定义函数示例代码汇总https://doc.oinone.top/designer/workflowdesigner/4802.html 6.工作流审核撤回/回退/拒绝钩子使用https://doc.oinone.top/backend/4542.html 三、工作流常见使用问题分析及处理 1.测试环境的流程向正式环境迁移,5.1.x是否还需要部署流程设计器https://doc.oinone.top/faq/17858.html 2.流程设计器里,部门领导审批环节,审批按钮不见了https://doc.oinone.top/faq/17684.html 3.流程设计器,在某个节点审批完后,能否自定义抄送/知会人员(可能多个)https://doc.oinone.top/faq/17516.html 4.流程设计器,填写审批意见,能支持富文本吗?https://doc.oinone.top/faq/17510.html 5.流程设计器,想在同意时加入电子签名https://doc.oinone.top/faq/17503.html 6.加了工作流模块,但是界面设计器模型动作下没有业务流程按钮https://doc.oinone.top/faq/17206.html 7.流程设计器,流程审批人是传哪个类型的IDhttps://doc.oinone.top/faq/17198.html 8.流程设计器里,配置更新数据触发场景,但更新数据时没有触发自动发起流程https://doc.oinone.top/faq/17192.html 9.动态根据业务数据的字段值显示审批同意按钮的文案https://doc.oinone.top/faq/13822.html 10.自定义审批方式、自定义审批节点名称https://doc.oinone.top/backend/4847.html

    2024年10月24日
    2.4K00
  • 【Excel导入/导出】多Sheet导入导出示例(4.7.x及以上版本)

    代码示例 示例仅供参考 点击下载代码示例 业务场景 准备工作:两个模型,物料(Material)和物料类别(MaterialCategory)。目标:在一个Excel模板中同时导入和导出两个模型的数据。 Material模型 @Model.model(Material.MODEL_MODEL) @Model.Advanced(unique = {"code"}) @Model(displayName = "物料", labelFields = {"name"}) public class Material extends IdModel { private static final long serialVersionUID = -2594216864389636135L; public static final String MODEL_MODEL = "maas.Material"; @Field.String @Field(displayName = "物料编码", required = true) private String code; @Field.String @Field(displayName = "物料名称", required = true) private String name; } MaterialCategory模型 @Model.model(MaterialCategory.MODEL_MODEL) @Model.Advanced(unique = {"code"}) @Model(displayName = "物料类别", labelFields = {"name"}) public class MaterialCategory extends IdModel { private static final long serialVersionUID = 6300896634558908349L; public static final String MODEL_MODEL = "maas.MaterialCategory"; @Field.String @Field(displayName = "类别编码", required = true) private String code; @Field.String @Field(displayName = "类别名称", required = true) private String name; } 模板定义 MaterialTemplate @Component public class MaterialTemplate implements ExcelTemplateInit { public static final String TEMPLATE_NAME = "materialTemplate"; @Override public List<ExcelWorkbookDefinition> generator() { WorkbookDefinitionBuilder builder = WorkbookDefinitionBuilder.newInstance(Material.MODEL_MODEL, TEMPLATE_NAME) .setDisplayName("物料和物料类别") .setEachImport(Boolean.FALSE);//设置importData的入参为 (ExcelImportContext importContext, List<MaterialCategory> data),如入参是单个对象,请删除setEachImport(Boolean.FALSE) createMaterialSheet(builder); createMaterialCategorySheet(builder); return Collections.singletonList(builder.build()); } private static void createMaterialSheet(WorkbookDefinitionBuilder builder) { builder.createSheet().setName("物料") .createBlock(Material.MODEL_MODEL, ExcelAnalysisTypeEnum.FIXED_HEADER, ExcelDirectionEnum.HORIZONTAL, "A1:B2") .createHeader().setStyleBuilder(ExcelHelper.createDefaultStyle()).setIsConfig(Boolean.TRUE) .createCell().setField("code").setAutoSizeColumn(Boolean.TRUE).and() .createCell().setField("name").setAutoSizeColumn(Boolean.TRUE).and() .and() .createHeader().setStyleBuilder(ExcelHelper.createDefaultStyle(v -> v.setBold(Boolean.TRUE)).setHorizontalAlignment(ExcelHorizontalAlignmentEnum.CENTER)) .createCell().setValue("物料编码").and() .createCell().setValue("物料名称"); } private static void createMaterialCategorySheet(WorkbookDefinitionBuilder builder) { builder.createSheet().setName("物料类别") .createBlock(MaterialCategory.MODEL_MODEL, ExcelAnalysisTypeEnum.FIXED_HEADER, ExcelDirectionEnum.HORIZONTAL, "A1:B2") .createHeader().setStyleBuilder(ExcelHelper.createDefaultStyle()).setIsConfig(Boolean.TRUE) .createCell().setField("code").setAutoSizeColumn(Boolean.TRUE).and()…

    2024年4月23日
    1.4K00

Leave a Reply

Please Login to Comment