深度分页问题优化方案

问题原因

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

相关推荐

  • 3.0.5版本更新说明-20220815

    版本号:3.0.5发布日期:2022.08.15更新要点: 前端更新:包括界面设计器布局优化和加密方式修改,数据编码组件优化,字段数据字典查看,表达式展示优化,Dialog组件改进。 后端更新:涵盖界面设计器布局支持和页面设计器迭代,数据编码元数据引用,数据字典查询功能,以及tableWidget改进。 1 发布概要 前端 界面设计器左树右表、级联设计 实现页面左树右表、级联布局 修改加密 模型设计器迭代优化 数据编码组件优化,支持选择已有编码 字段的数据字典可直接点击查看 表达式内支持展示已废弃的字段,不可选中 后端 界面设计器左树右表 layout支持 页面设计器迭代6,除树表级联部分 数据编码元数据引用 数据编码、数据字典所属模块查询 tableWidget的rowActions区域变更为rowActionWidget 2.版本信息 <pamirs.middleware.version>3.0.1</pamirs.middleware.version> <pamirs.boot.version>3.0.3</pamirs.boot.version> <pamirs.core.version>3.0.4.2</pamirs.core.version> <pamirs.tenant.version>3.0.1</pamirs.tenant.version> <pamirs.lowcode.version>3.0.1</pamirs.lowcode.version> <pamirs.designer.version>3.0.2-SNAPSHOT</pamirs.designer.version> <pamirs.workflow.designer.version>3.0.6</pamirs.workflow.designer.version> <pamirs.model.designer.version>3.0.3</pamirs.model.designer.version> <pamirs.logic.designer.version>3.0.1</pamirs.logic.designer.version> <pamirs.ui.designer.version>3.1.6-cpc</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.distribution.version>3.0.1</pamirs.distribution.version> <pamirs.welcome.version>3.0.3</pamirs.welcome.version> <pamirs.gemini.version>3.0.6</pamirs.gemini.version> <pamirs.paas.version>3.0.3</pamirs.paas.version> 如果您有任何问题、建议或反馈,请随时联系我们。为了获得最佳体验,建议请升级至最新版本。我们将继续努力改进产品,提供更好的服务。谢谢支持!

    2022年8月15日
    97600
  • 5.1.0版本bugfix:修复协同开发界面设计器函数无法正常使用的问题,请升级对应版本

    版本号: 5.1.10 版本发布日期:2024.09.05更新要点:修复协同开发界面设计器函数无法正常使用的问题 5.1.10 版本 升级说明及步骤(已升级为5.0.0版本忽略) 此版本与4.7.8版本的兼容方案如下,请严格参照升级说明及步骤进行1、【重要】升级前备份base库和用户权限模块所在的库 2、【重要】升级过程执行SQL严格按照升级文档中的步骤执行。特别注意:部分SQL是要求【发布前执行】,部分SQL是要求【发布后执行】 5.0.0升级详细说明及步骤 升级内容(5.1.0) 修复协同开发界面设计器函数无法正常使用的问题 修复GQL层级过深导致无法返回的问题 修复LambdaQueryWrapper在使用select时无法正确处理存储的关联关系字段的问题 修复元数据函数变更时缓存无法正确更新的问题 修复在某些情况下无法正常切换语言的问题 修复前端上传下载时使用相对路径错误覆盖文件的问题 修复EIP用户初始化未正确设置用户来源的问题 修复PamirsMessageJsonConverter转换异常的问题 修复短信和邮件节点,模型相关无法通知的问题。 修复自定义通知人,未调用自定义函数的逻辑缺失。 完善短信发送查询,短信手机号先通过员工表查询,员工表查询失败从用户中心查询。 优化邮件和短信节点的报错信息,显示没有联系方式的用户,将阿里云的报错信息展示到节点错误信息中。 修复邮件服务器配置详情页报错。 修改邮件服务器配置SMTP用户名和服务器地址单索引改为联合索引,优化提示信息。 失效的用户/员工不发送通知,并记录节点日志。 修复通过配置文件配置邮箱后,UI修改邮箱名称,系统重启报错的问题。 应用环境的几个菜单添加搜索功能。 修复无代码模型导入部分场景无法添加字段的问题。 修复工作流部分数学公式(加减乘除)无法处理人工输入数据的问题。 修复工作流人工节点抄送时选择创建/更新人无法抄送的问题。 工作流转交/加签支持选择多个用户 请尽可能保证业务工程前后端服务以及设计器同步升级前端服务仅需重新执行npm install即可自动升级到最新版本 版本包信息 Oinone平台部署及依赖说明(v5.0) 未使用到的版本号请忽略,按项目中使用到的进行替换。 <!– 平台基础 –> <pamirs.middleware.version>5.0.3</pamirs.middleware.version> <pamirs.k2.version>5.1.7</pamirs.k2.version> <pamirs.framework.version>5.1.13</pamirs.framework.version> <pamirs.boot.version>5.1.8</pamirs.boot.version> <pamirs.distribution.version>5.1.7</pamirs.distribution.version> <!– 平台功能 –> <pamirs.metadata.manager>5.1.2</pamirs.metadata.manager> <pamirs.designer.metadata.version>5.1.3</pamirs.designer.metadata.version> <pamirs.core.version>5.1.17</pamirs.core.version> <pamirs.workflow.version>5.1.8</pamirs.workflow.version> <pamirs.workbench.version>5.1.0</pamirs.workbench.version> <pamirs.data.visualization.version>5.1.3</pamirs.data.visualization.version> <!– 设计器 –> <pamirs.designer.common.version>5.1.2</pamirs.designer.common.version> <pamirs.flow.designer.base.version>5.1.3</pamirs.flow.designer.base.version> <pamirs.workflow.designer.version>5.1.2</pamirs.workflow.designer.version> <pamirs.model.designer.version>5.1.4</pamirs.model.designer.version> <pamirs.ui.designer.version>5.1.9</pamirs.ui.designer.version> <pamirs.data.designer.version>5.1.2</pamirs.data.designer.version> <pamirs.dataflow.designer.version>5.1.1</pamirs.dataflow.designer.version> <pamirs.eip.designer.version>5.1.2</pamirs.eip.designer.version> 注意镜像名称变化 镜像说明 所有镜像均使用docker manifest支持amd64和arm64架构。如镜像拉取过慢,可在对应镜像Tag添加-amd64、-arm64后缀获取单一架构镜像。 docker pull harbor.oinone.top/oinone/oinone-designer-full-v5.1:5.1.10-amd64 docker pull harbor.oinone.top/oinone/oinone-designer-full-v5.1:5.1.10-arm64 镜像拉取 镜像或JAR版本:5.1.10 体验镜像:(所有中间件及前后端服务,包含全部设计器) docker pull harbor.oinone.top/oinone/oinone-designer-full-v5.1:5.1.10 部署镜像:(包含前后端服务,包含全部设计器) docker pull harbor.oinone.top/oinone/oinone-designer-mini-v5.1:5.1.10 流程设计器镜像:(包含前后端服务,仅包含流程设计器) docker pull harbor.oinone.top/oinone/workflow-designer-v5.1:5.1.10 后端镜像:(仅包含后端服务,包含全部设计器) docker pull harbor.oinone.top/oinone/designer-backend-v5.1:5.1.10 前端镜像:(仅包含前端服务,包含全部设计器) PS:前端镜像版本为独立版本,与其他镜像版本不同。原基础镜像为nginx-1.21.0版本,从5.0.7版本开始使用nginx-1.24.0版为基础镜像 docker pull harbor.oinone.top/oinone/designer-frontend-v5.1:5.1.16 独立部署所有设计器JAR:(后端服务,包含所有设计器)pamirs-designer-boot-v5.1-5.1.10.jarpamirs-designer-boot-v5.1-latest.jar 独立部署流程设计器JAR:(后端服务,仅包含流程设计器)pamirs-workflow-designer-boot-v5.1-5.1.10.jarpamirs-workflow-designer-boot-v5.1-latest.jar 后端无代码设计器Jar包启动方法 如果您有任何问题、建议或反馈,请随时联系我们。为了获得最佳体验,请及时更新至最新版本。我们将继续努力改进产品,提供更好的服务。谢谢!

    2024年9月5日
    1.0K00
  • 数据可视化的导入导出

    目录 依赖包安装GraphQL的工具登录gql导出生成json文件子业务工程中导入示例代码 简介 通过调用导出接口,将设计器的设计数据与元数据打包导出到文件中。提供了download/export两类接口。 依赖包 <dependency> <groupId>pro.shushi.pamirs.metadata.manager</groupId> <artifactId>pamirs-metadata-manager</artifactId> </dependency> 安装GraphQL的工具 下载官网地址:https://github.com/Kong/insomnia/releases 登录gql 示例调用代码 mutation { pamirsUserTransientMutation { login(user: { login: "admin", password: "admin" }) { needRedirect broken errorMsg errorCode errorField } } } 导出生成json文件 执行GraphQL,直接返回导出数据。适用于通过浏览器直接下载文件。 全部导出 请求示例: mutation { dataDesignerExportReqMutation { export(data: { fileName: "datavi_data" }) { jsonUrl } } } 指定图表导出 请求示例: mutation { dataDesignerExportReqMutation { export(data: { chartCode: "CT00000000002000", fileName: "datavi_data" }) { jsonUrl } } } 对应chartCode为图表的编码code,可通过查询数据库来获得 指定报表导出 请求示例: mutation { dataDesignerExportReqMutation { export(data: { reportCode: "RP00001000", fileName: "datavi_data" }) { jsonUrl } } } 对应reportCode为报表的编码code,可通过查询数据库来获得 指定业务大屏导出 请求示例: mutation { dataDesignerExportReqMutation { export(data: { screenCode: "DS00001000", fileName: "datavi_data" }) { jsonUrl } } } 对应screenCode为数据大屏的编码code,可通过查询数据库来获得 业务工程中导入示例代码 导入元数据示例代码 @Slf4j @Order(Integer.MAX_VALUE-1) @Component public class DemoModuleAppInstall implements MetaDataEditor, LifecycleCompletedAllInit { //流程设计器导出的页面元数据json private static final String INSTALL_DATAVI_META_PATH = "install/datavi_data.json"; @Override public void edit(AppLifecycleCommand command, Map<String, Meta> metaMap) { if(StringUtils.isBlank(INSTALL_DATAVI_META_PATH)) return; log.info("开始安装-元数据"); try { InitializationUtil util = InitializationUtil.get(metaMap, DemoModule.MODULE_MODULE, DemoModule.MODULE_NAME); if (null != util) { // 设计器的元数据 if(StringUtils.isNotBlank(INSTALL_DATAVI_META_PATH)) { log.info("开始安装图表元数据"); DesignerInstallHelper.mateInitialization(util, INSTALL_DATAVI_META_PATH, DemoModule.MODULE_MODULE, DemoModule.MODULE_NAME); } } } catch (Exception e) { log.error("图表设计器元数据导入异常", e); } } @Override public void process(AppLifecycleCommand command, Map<String, ModuleDefinition>…

    2024年5月16日
    1.8K00
  • 如何用调试工具提升效率

    相关文档参考 问题排查调试工具使用手册:https://doc.oinone.top/kai-fa-shi-jian/7484.html 调试工具在业务场景的使用-前端https://doc.oinone.top/shu-shi-oinone-xue-yuan/kai-fa-pai-cuo-ji-qiao/18412.html 调试工具在业务场景的使用-前端:https://doc.oinone.top/wen-ti-zhen-duan/17746.html 如何通过浏览器开发者工具提高调试效率https://doc.oinone.top/frontend/17130.html

    2024年10月29日
    99200

Leave a Reply

登录后才能评论