深度分页问题优化方案

问题原因

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

(0)
的头像
上一篇 2023年6月20日 pm4:07
下一篇 2023年11月2日 pm1:58

相关推荐

  • 4.7.8.3版本升级说明-20240408

    版本号: 4.7.8.3版本发布日期:2024.04.08更新要点:该版本支持openGauss,Oinone可视化调试工具 4.7.8.3版本 升级内容 1、本支持openGauss 2、Oinone可视化调试工具 版本包信息 未使用到的版本号请忽略,按项目中使用到的进行替换 4.7.8.3 4.7.8.3 4.7.8.3 4.7.8.3 4.7.8.3 4.7.8.3 4.7.8 4.7.8 4.7.8 4.7.8 4.7.8 4.7.8 4.7.8 4.7.8 4.7.8 4.7.8 4.7.8 4.7.8 4.7.8 docker pull harbor.oinone.top/oinone/designer:4.7.9.7-allinone-fulldocker pull harbor.oinone.top/oinone/designer:4.7.9.7-allinone-mini 相关参考 【OpenGauss】后端部署使用OpenGauss数据库,参考:https://doc.oinone.top/backend/6424.html 如果您有任何问题、建议或反馈,请随时联系我们。为了获得最佳体验,请及时更新至最新版本。我们将继续努力改进产品,提供更好的服务。谢谢!

    2024年4月8日
    1.4K00
  • 多tab栏样式

    该模块允许用户自定义多Tab栏的显示与行为设置,通过启用或关闭标签页功能来控制系统风格。

    2024年9月20日
    96100
  • 早鸟版发布: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 升级说明及步骤 20260403 升级内容 后端镜像版本升级: 7.2.0 –> 7.2.2 前端镜像版本升级: 7.2.0 –> 7.2.1 后端版本升级: 7.2.0 –> 7.2.2 前端版本升级 工作流以及数据流程的WorkflowInstance中runtimeDefinition移除到另外表中 修复数据流程EipApiTask节点,数组赋值传递异常问题 修复国家设置关键字映射无法正常保存的问题 修复翻译项初始化异常的问题 修复多值枚举搜索异常的问题 修复微流设计器复制和编辑无法正常跳转的问题 20260331 升级内容 镜像版本升级: 7.2.0 后端版本升级: 7.2.0 前端版本升级 Oinone 支持国际版(需使用英文版许可证) Oinone 支持自由选购 点击查看 后端版本包信息 Oinone平台部署及依赖说明(v7.0) 未使用到的版本号请忽略,按项目中使用到的进行替换。 <!– 平台基础 –> <oinone-bom.version>7.2.2</oinone-bom.version> <!– 设计器 –> <pamirs.workflow.designer.version>7.2.0</pamirs.workflow.designer.version> <pamirs.model.designer.version>7.2.0</pamirs.model.designer.version> <pamirs.ui.designer.version>7.2.0</pamirs.ui.designer.version> <pamirs.print.designer.version>7.2.0</pamirs.print.designer.version> <pamirs.data.designer.version>7.2.0</pamirs.data.designer.version> <pamirs.dataflow.designer.version>7.2.0</pamirs.dataflow.designer.version> <pamirs.eip.designer.version>7.2.0</pamirs.eip.designer.version> <pamirs.microflow.designer.version>7.2.0</pamirs.microflow.designer.version> <pamirs.ai.designer.version>7.2.0</pamirs.ai.designer.version> <dependencyManagement> <dependencies> <dependency> <groupId>pro.shushi</groupId> <artifactId>oinone-bom</artifactId> <version>${oinone-bom.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>pro.shushi.pamirs.designer</groupId> <artifactId>pamirs-model-designer-api</artifactId> <version>${pamirs.model.designer.version}</version> </dependency> <dependency> <groupId>pro.shushi.pamirs.designer</groupId> <artifactId>pamirs-ui-designer-api</artifactId> <version>${pamirs.ui.designer.version}</version> </dependency> <dependency> <groupId>pro.shushi.pamirs.dataflow</groupId> <artifactId>pamirs-dataflow-designer-api</artifactId> <version>${pamirs.dataflow.designer.version}</version> </dependency> <dependency> <groupId>pro.shushi.pamirs.designer</groupId> <artifactId>pamirs-eip-designer-api</artifactId> <version>${pamirs.eip.designer.version}</version> </dependency> </dependencies> </dependencyManagement> oinone-bom详细版本信息 <!– 平台基础 –> <oinone-pamirs.version>7.2.1</oinone-pamirs.version> <!– 元数据增强 –> <pamirs.meta.enhance.version>7.2.0</pamirs.meta.enhance.version> <!– 平台功能 –> <pamirs.distribution.version>7.2.0</pamirs.distribution.version> <pamirs.metadata.manager>7.2.0</pamirs.metadata.manager> <pamirs.designer.metadata.version>7.2.0</pamirs.designer.metadata.version> <pamirs.workflow.version>7.2.1</pamirs.workflow.version> <pamirs.workbench.version>7.2.0</pamirs.workbench.version> <pamirs.data.visualization.version>7.2.0</pamirs.data.visualization.version> <pamirs.fusion.version>7.2.0</pamirs.fusion.version> <!– 设计器 –> <pamirs.designer.common.version>7.2.0</pamirs.designer.common.version> <pamirs.flow.designer.base.version>7.2.0</pamirs.flow.designer.base.version> 前端版本包信息 { "@oinone/kunlun-dependencies": "~7.2.0", "@oinone/kunlun-vue-ui-antd": "~7.2.0", "@oinone/kunlun-vue-ui-el": "~7.2.0", "@oinone/kunlun-mobile-dependencies": "~7.2.0", "@oinone/kunlun-vue-ui-mobile-vant": "~7.2.0", "@oinone/kunlun-mobile-workbench": "~7.2.0", "@oinone/kunlun-data-designer-open-pc": "~7.2.0", "@oinone/kunlun-data-designer-open-mobile": "~7.2.0" } 前端详细版本信息 可通过node_modules/@oinone查看 { "@oinone/kunlun-cache": "7.2.0", "@oinone/kunlun-dsl": "7.2.0", "@oinone/kunlun-environment": "7.2.0", "@oinone/kunlun-event": "7.2.0", "@oinone/kunlun-expression": "7.2.0", "@oinone/kunlun-meta": "7.2.0", "@oinone/kunlun-request": "7.2.0", "@oinone/kunlun-router": "7.2.0", "@oinone/kunlun-service": "7.2.0", "@oinone/kunlun-shared": "7.2.0", "@oinone/kunlun-spi": "7.2.0", "@oinone/kunlun-state": "7.2.0", "@oinone/kunlun-theme": "7.2.0", "@oinone/kunlun-engine": "7.2.1", "@oinone/kunlun-vue-admin-base": "7.2.0", "@oinone/kunlun-vue-admin-layout": "7.2.0", "@oinone/kunlun-dependencies": "7.2.0",…

    2026年3月31日
    49600
  • 前端初阶知识点讲解

    相关文章推荐: 前端文章大纲: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.0K00
  • 如何实现页面间的跳转

    介绍 在日常的业务中,我们经常需要在多个模型的页面之间跳转,例如从商品的行可以直接点击链接跳转到类目详情,还有查看该订单发起的售后单列表,这里将给大家展示如何在oinone中如何实现这些功能。 方法一、通过界面设计器的无代码能力配置 表格行跳转到表单页/详情页 拖入一个跳转动作到表格行,保存动作后,在左侧的动作属性面板底部有个请求配置,里面的上下文属性就是配置跳转参数的地方,点击添加按钮可以增加一行参数 点击添加按钮后,可以看到新增了一行,行内有2个输入框,左侧输入框为目标视图模型的字段,右侧输入框为当前视图模型的表达式 注意 表达式中activeRecord关键字代表当前行的数据对象 “上下文”相关知识点 当前页面的模型和跳转后的页面模型相同的情况下,会字段带上当前行数据的id作为路由参数 上下文是从当前页面跳转到下个页面带的自定义参数 上下文会作为跳转后的页面数据加载函数的入参,后端的该函数需要根据该条件查询到数据返回给前端,典型的例子就是编辑页,根据id查询对象的其他字段信息返回 跳转后页面的数据加载函数可以在动作场景的时候选择加载函数,也可以在页面的加载函数处设置 方法二、通过低代码方式在自定义代码中调用 oinone提供了内置函数executeViewAction实现该功能 import { DefaultComparisonOperator, executeViewAction, QueryExpression, RuntimeViewAction, ViewActionTarget, ViewType } from '@kunlun/dependencies'; export class JumpActionWidget { protected goToObjectView() { executeViewAction( { viewType: ViewType.Form, moduleName: 'resource', model: 'resource.ResourceCountry', name: 'redirectUpdatePage', target: ViewActionTarget.Router } as RuntimeViewAction, undefined, undefined, { // 此处为id参数,目前只有表单和详情页需要 id: '12223', // 此处为上下文参数,context内对象的key是目标页面需要传递的默认值 context: JSON.stringify({code: 'xxx'}), // 此处为跳转后左侧菜单展开选中的配置 menu: JSON.stringify({"selectedKeys":["国家"],"openKeys":["地址库","地区"]}) } ); } protected goToListView() { const searchConditions: QueryExpression[] = []; searchConditions.push({ leftValue: ['countryCode'], // 查询条件的字段 operator: DefaultComparisonOperator.EQUAL, right: 'CN' // 字段的值 }); executeViewAction( { viewType: ViewType.Table, moduleName: 'resource', model: 'resource.ResourceCity', name: 'resource#市', target: ViewActionTarget.OpenWindow } as RuntimeViewAction, undefined, undefined, { // searchConditions相当于domain,不会随页面搜索项重置动作一起被清空 searchConditions: encodeURIComponent(JSON.stringify(searchConditions)), // searchBody的字段会填充搜索区域的字段组件,会随页面搜索项重置动作一起被清空 searchBody: JSON.stringify({code: 'CN'}), menu: JSON.stringify({"selectedKeys":["国家"],"openKeys":["地址库","地区"]}) } ); } } 扩展知识点 为什么executeViewAction跳转到的新页面不是入参的moduleName属性对应的模块? 答:跳转后所在的模块优先级为: 第一个入参的resModuleName属性对应的模块 执行executeViewAction时所在的模块 第一个入参的moduleName属性对应的模块 如何快速获取选中菜单的值? 答:先通过页面菜单手动打开页面,然后在浏览器自带调试工具的控制台执行decodeURIComponent(location.href),其中的menu参数就是我们需要的值

    2024年5月13日
    3.1K00

Leave a Reply

登录后才能评论