深度分页问题优化方案

问题原因

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

相关推荐

  • 5.3.9版本更新日志:新增Excel上传支持file和classpath协议路径,请升级对应版本

    版本号: 5.3.9 版本发布日期:2025.04.28更新要点:新增Excel上传支持file和classpath协议路径 5.3.0 版本 升级说明及步骤(已升级为5.0.0版本忽略) 5.3.x版本以后无法通过4.7.8版本进行升级,请先升级到5.2.x版本进行权限迁移后再升级至5.3.x版本 20250818升级内容 镜像版本升级: 5.3.9.7 –> 5.3.9.8 后端版本升级: 5.3.9.5 –> 5.3.9.6 修复元数据继承计算未正确处理由界面设计器创建的提交动作的问题 修复界面设计器复制视图到子模型时无法复制提交动作的问题 20250611升级内容 镜像版本升级: 5.3.9.6 –> 5.3.9.7 后端版本升级: 5.3.9.4 –> 5.3.9.5 修复Excel导出未正确翻译的问题 20250428升级内容 镜像版本升级: 5.3.9.5 –> 5.3.9.6 后端版本升级: 5.3.9.3 –> 5.3.9.4 新增Excel上传支持file和classpath协议路径 20250417升级内容 镜像版本升级: 5.3.9.4 –> 5.3.9.5 前端版本升级 后端版本升级: 5.3.9.2 –> 5.3.9.3 修复登录页面语言与登录后不一致的问题 20250315升级内容 镜像版本升级: 5.3.9.1 –> 5.3.9.4 前端版本升级 后端版本升级 修复多对多关系字段在某些特殊场景下无法正确提交的问题 修复一对多/多对多表格导入导出无权限的问题 修复导出时表达式未正确解析的问题 修复单用户模式下session未正确续约的问题 修复在事务中使用数据审计导致内存数据变更的问题 修复自定义顶部栏动作权限校验失败的问题 修复权限节点后置处理未正确清理顶级节点的问题 修复在低代码模型中添加的无代码字段无法正确导出的问题 升级内容(5.3.0) 修复子表格导入导出权限控制异常的问题 修复权限首页子节点加载错误的问题 修复翻译工具栏权限控制异常的问题 修复在特殊场景下由于二级缓存预处理导致无法正常鉴权的问题 webService接口来源上下文修改 流程参数传递 修复行内编辑失效 修复文件名包含 % 导致解析失败 请尽可能保证业务工程前后端服务以及设计器同步升级前端服务仅需重新执行npm run clean && npm install即可自动升级到最新版本 后端版本包信息 Oinone平台部署及依赖说明(v5.3) 未使用到的版本号请忽略,按项目中使用到的进行替换。 <!– 平台基础 –> <oinone.version>5.3.9.6</oinone.version> <!– 设计器 –> <pamirs.workflow.designer.version>5.3.0</pamirs.workflow.designer.version> <pamirs.model.designer.version>5.3.7</pamirs.model.designer.version> <pamirs.ui.designer.version>5.3.8</pamirs.ui.designer.version> <pamirs.data.designer.version>5.3.1</pamirs.data.designer.version> <pamirs.dataflow.designer.version>5.3.1</pamirs.dataflow.designer.version> <pamirs.eip.designer.version>5.3.3</pamirs.eip.designer.version> <pamirs.microflow.designer.version>5.3.0</pamirs.microflow.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.4</pamirs.middleware.version> <pamirs.k2.version>5.3.1</pamirs.k2.version> <pamirs.framework.version>5.3.7</pamirs.framework.version> <pamirs.boot.version>5.3.5</pamirs.boot.version> <pamirs.distribution.version>5.3.1</pamirs.distribution.version> <!– 平台功能 –> <pamirs.metadata.manager>5.3.3</pamirs.metadata.manager> <pamirs.designer.metadata.version>5.3.3</pamirs.designer.metadata.version> <pamirs.core.version>5.3.17</pamirs.core.version> <pamirs.workflow.version>5.3.11</pamirs.workflow.version> <pamirs.workbench.version>5.3.0</pamirs.workbench.version> <pamirs.data.visualization.version>5.3.3</pamirs.data.visualization.version> <!– 设计器 –> <pamirs.designer.common.version>5.3.1</pamirs.designer.common.version> <pamirs.flow.designer.base.version>5.3.8</pamirs.flow.designer.base.version> 前端版本包信息 { "@kunlun/dependencies": "5.3.23", "@kunlun/vue-ui-antd": "5.3.23", "@kunlun/vue-ui-el": "5.3.23", "@kunlun/mobile-dependencies": "5.3.10", "@kunlun/vue-ui-mobile-vant": "5.3.10", "@kunlun/mobile-workbench": "5.3.6", "@kunlun/data-designer-open-pc": "5.3.0", "@kunlun/data-designer-open-mobile": "5.3.0" } 前端详细版本信息 可通过node_modules/@kunlun查看 { "@kunlun/cache": "5.3.5", "@kunlun/dsl": "5.3.5", "@kunlun/environment": "5.3.5", "@kunlun/event": "5.3.5", "@kunlun/expression": "5.3.5", "@kunlun/meta": "5.3.5", "@kunlun/request": "5.3.5", "@kunlun/router": "5.3.5", "@kunlun/service": "5.3.5", "@kunlun/shared": "5.3.5", "@kunlun/spi": "5.3.5", "@kunlun/state": "5.3.5", "@kunlun/theme": "5.3.5",…

    2025年3月12日
    1.3K00
  • 如何扩展行为权限

    注意:5.2.8 以上版本适用 需求 我们的权限控制需要在页面上有交互才可以在管理中心控制该动作权限,在没有页面交互的动作是不能进行授权操作的。所以本文章将介绍如何将页面上没有交互的动作接入到系统权限中管理。 一、扩展系统权限的菜单页面 实现 步骤: 创建授权节点实现权限节点扩展接口:pro.shushi.pamirs.auth.api.extend.load.PermissionNodeLoadExtendApi#buildRootPermissions @Component @Order(88) public class MyTestNodeLoadExtend implements PermissionNodeLoadExtendApi { public static final String MODEL = AuthTest.MODEL_MODEL; public static final String MODULE = TopModule.MODULE_MODULE; public static final String FUN = "dataStatus"; @Override public List<PermissionNode> buildRootPermissions(PermissionLoadContext loadContext, List<PermissionNode> nodes) { //创建授权根节点 PermissionNode root = createMyNode(); List<PermissionNode> newNodes = new ArrayList<>(); //从缓存中读取需要授权的Action Action cacheAction = PamirsSession.getContext().getExtendCache(ActionCacheApi.class).get(MODEL, FUN); if (cacheAction != null) { //将该Action放入权限树 //权限鉴权的path路径是根据【cacheAction.getModel() + cacheAction.getName()】拼接的。和MODULE没有关系,这里MODULE可以自定义。 AuthNodeHelper.addNode(newNodes, root, AuthNodeHelper.createActionNode(MODULE, cacheAction, root)); } nodes.add(0, root); return newNodes; } private PermissionNode createMyNode() { return AuthNodeHelper.createNodeWithTranslate("MyNode", "自定义节点"); } } 在管理中心中我们可以看到代码里创建的授权节点。 给角色分配该动作的权限,调用我们配置的AuthTest模型的dataStatus动作看效果。 二、扩展菜单下的动作权限 实现 步骤: 创建viewAction用于作为权限菜单"permissionExtension"是自定义的viewAction的name,用于下面拼path路径鉴权。因为这里只需要在系统权限那边利用这个viewAction创建出授权节点。所以”权限扩展form“可以随意定义名字,系统会拿默认视图。 @Model.model(AuthTest.MODEL_MODEL) @Component @UxRouteButton( action = @UxAction(name = "permissionExtension", displayName = "权限扩展", label = "权限扩展", contextType = ActionContextTypeEnum.CONTEXT_FREE), value = @UxRoute(model = AuthTest.MODEL_MODEL, viewName = "权限扩展form", openType = ActionTargetEnum.ROUTER)) public class AuthTestAction { @Action(displayName = "启用", contextType = ActionContextTypeEnum.SINGLE) public AuthTest dataStatus(AuthTest data) { data.setOrgName("给个值"); return data; } } 创建授权节点实现权限节点扩展接口:pro.shushi.pamirs.auth.api.extend.load.PermissionNodeLoadExtendApi#buildRootPermissions @Component @Order(88) public class MyTestNodeLoadExtend implements PermissionNodeLoadExtendApi { //创建授权根节点 @Override public List<PermissionNode> buildRootPermissions(PermissionLoadContext loadContext, List<PermissionNode> nodes) { PermissionNode root = AuthNodeHelper.createNodeWithTranslate("CustomNode", "自定义节点"); List<PermissionNode> newNodes = new ArrayList<>(); newNodes.add(root); ViewAction viewAction = new ViewAction().setModel(AuthTest.MODEL_MODEL).setName("permissionExtension").queryOne(); //将该Action放入权限树 //权限鉴权的path路径是根据【viewAction.getModel(),…

    2024年11月1日
    1.5K00
  • 快速上手

    Oinone是一个企业级产品化引擎,专注于为企业在项目型、行业产品和标品的三个发展阶段提供极具成本效益的解决方案,帮助企业高效应对核心技术挑战,打造自有得研发平台。 建议大家以下方流程深度体验Oinone的各种能力、了解熟悉Oinone的设计理念、解题思路;同时我们也在微信群提供1V1的解答;有解决不了的问题随时联系对应的支持人员; 部署所需资料包 提示:安装启动具体操作查看“快速启动”。其它版本也可,建议使用以上版本。 入门学习路径 这是整个学习的过程:注意:此图的每一步都可在下面的目录中找到,大家跟随操作即可(有文档有视频)! 快速启动 环境准备须知(部署前必看) * 无代码启动 常见问题 * 无代码启动常见问题 后端启动常见问题 入门培训视频 整体概念(点击此处观看) 视频简介: 平台整体介绍、核心理念、研发方式、要解决的问题 观看对象: 建议都看 后端(点击此处观看) 视频简介: 如何开始、与原有开发方式有什么差异?元数据是什么?前后端如何协作?0-1开发一个新场景,解答疑惑 观看对象: 后端,对Java有基础的了解 前端(点击此处观看) 视频简介: 前端要做什么?怎么做到不用联调?写的代码怎么沉淀、复用?与后端如何协作?每种场景都有一个示例,有最基本的概念讲解 观看对象: 前端,对Vue有基础的了解 无代码(点击此处观看) 视频简介: 无代码有什么定位?在开发、测试、生产阶段能做什么?对研发有什么帮助?无代码基础使用入门讲解 观看对象: 建议都看 按教程还原业务场景(文档) 后端 前端 按教程还原业务场景(视频) 后端 前端

    2024年11月9日
    4.3K00
  • 3.0.3版本更新说明-20220719

    版本号:3.0.3发布日期:2022.07.19更新要点: 卡片组件现支持标题工具栏设计,【动作区操作显示数量】属性 表格组件新增【操作列显示数量】属性 填写审批节点的表单视图已更新为新协议,任务待办区界面和view读取进行了优化 修复了任务待办显示页面组件问题,消息通知优化,新增站内信查看功能 新增短信和邮件节点的错误号码查看功能,选择通知人时可选择模型中的手机和邮箱字段 1 发布概要 1.1 前端 发布内容: 工作流执行切换成新协议 消息弹窗优化,增加站内信分类 工作流执行增加工作流消息概要 工作流设计增加模型分类 工作流设计增加字段类型 1.11 表达式迭代 运算表达式的连接符根据表达式行数据类型变动 支持删除第一行表达式行(除只有一行的情况) 后端日期函数的第一个参数的ttype都是datetime,导致根据ADD_YEAR和ADD_MONTH的第一个参数根据ttype过滤时取不到正确类型的可选字段 函数的参数类型修复 1.12 界面设计器迭代 卡片组件支持标题工具栏设计 片组件支持【动作区操作显示数量】属性 表格组件支持【操作列显示数量】属性 1.2 后端 发布内容: 填写审批节点的表单视图使用新协议 任务待办区界面优化以及优化view的读取 修复任务待办显示页面组件问题 优化消息通知,增加站内信查看 增加短信和邮件节点的错误号码查看功能 增加选择通知人时可选择模型中的手机和邮箱字段 2.版本信息 <!–pamirs底层包–> <pamirs.middleware.version>3.0.1</pamirs.middleware.version> <pamirs.boot.version>3.0.1</pamirs.boot.version> <pamirs.core.version>3.0.2</pamirs.core.version> <pamirs.tenant.version>3.0.1</pamirs.tenant.version> <pamirs.lowcode.version>3.0.1</pamirs.lowcode.version> <pamirs.distribution.version>3.0.1</pamirs.distribution.version> <!–设计器包–> <pamirs.designer.version>3.0.1</pamirs.designer.version> <pamirs.workflow.designer.version>3.0.4</pamirs.workflow.designer.version> <pamirs.model.designer.version>3.0.2</pamirs.model.designer.version> <pamirs.logic.designer.version>3.0.1</pamirs.logic.designer.version> <pamirs.ui.designer.version>3.1.2</pamirs.ui.designer.version> <pamirs.data.designer.version>3.0.3</pamirs.data.designer.version> <pamirs.data.visualization.version>3.0.3</pamirs.data.visualization.version> <!–官网用户包–> <pamirs.welcome.version>3.0.3</pamirs.welcome.version> <!–全员营销–> <pamirs.gemini.version>3.0.4</pamirs.gemini.version> <!–pass包–> <pamirs.paas.version>3.0.3</pamirs.paas.version> 如果您有任何问题、建议或反馈,请随时联系我们。为了获得最佳体验,建议请升级至最新版本。我们将继续努力改进产品,提供更好的服务。谢谢支持!

    2022年7月19日
    1.3K00
  • 前端初阶知识点讲解

    相关文章推荐: 前端文章大纲:https://doc.oinone.top/shu-shi-oinone-xue-yuan/xiang-mu-shi-jian-qian-duan-kai-fa-chong-dian-zhan/qian-duan-ji-chu/19196.html 【前端】项目开发前端知识要点地图:https://doc.oinone.top/frontend/51.html

    2024年10月8日
    1.1K00

Leave a Reply

Please Login to Comment