深度分页问题优化方案

问题原因

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

相关推荐

  • 常见启动问题

    一、配置问题: 1.证书问题,如过期、路径等。排查文档:https://doc.oinone.top/install/backendinstall/13760.html2.模型中关系字段配置问题。排查文档:https://doc.oinone.top/wen-ti-zhen-duan/15999.html3.跨模块依赖诸多问题。排查文档:https://doc.oinone.top/install/backendinstall/14824.html4.代码问题。如枚举类忘记添加类注解等 二、 环境问题: 1.版本问题。同base库的多个环境版本不一致,从而引发系列问题,如数据表重复新增删除。2.数据表唯一键冲突。 三、场景启动问题分析及解决方案 1.后端启动慢如何排查https://doc.oinone.top/faq/16613.html 2.验证服务是否启动成功https://doc.oinone.top/oinone-faq/17905.html 3.启动时提示未配置SQL记录存储目录,然后启动失败报错https://doc.oinone.top/faq/17048.html 4.启动报错,公共环境开启了元数据保护模式,本地开发环境需配置https://doc.oinone.top/faq/17045.html 5.在docker容器里启动,路径配置正确,仍旧报错https://doc.oinone.top/faq/17040.html 6.容器启动服务,License认证报错https://doc.oinone.top/faq/17039.html 7.系统启动耗时过长,内存耗用过大https://doc.oinone.top/faq/6659.html 8.启动提示:依赖的模块不存在https://doc.oinone.top/faq/6630.html 9.协同模式下,本地开发的模型在设计器里找不到https://doc.oinone.top/faq/17110.html 10.测试服务访问测试服务里docker容器的设计器服务接口,报dubbo接口不存在https://doc.oinone.top/faq/17055.html

    2024年10月23日
    60600
  • 梅丛银

    认识陈鹏程及数式核心团队同学已经有一段时间了,在我们多次的交流讨论中时常会谈及:未来中国哪家软件企业能在互联网云原生时代走出来超越传统软件企业?史昂说这是他的梦想,也是他们团队这么多年坚持技术和产品研发与应用优先思考之路。史昂及数式核心团队面向企业应用市场历经三年的潜心研发和实战交付,推出Oinone产品及配套的低代码平台工具:对比国内外应用软件平台在开放生态和云原生均有它的继承性和独特性,特别是将技术平台赋予企业各种业务领域属性,便于企业客户和开发伙伴的二次开发并能快速搭建各类企业核心应用场景是Oinone的最大亮点。Oinone的内在特点之一是参考了全球最大开源ERP Odoo的元数据模型设计,同时基于业务中台架构和云原生技术,形成了自己一套国际化的快速开发平台、建模规范和应用产品,通过自己进场落地很多品牌企业的应用中台化不断迭代升级,走出了一条具有显著特色的新应用软件之路。史昂及团队特点谦卑、善于思考,善于吸收他山之精华,这是创业团队难能可贵之点,由此能善于与生态伙伴合作也是能够走的更远更长的基础基因。最后希望和祝愿Oinone能为中国企业在云时代数字化实践做出更多的贡献,为软件产业构建强大的应用生态和开发社区,真正树立起Oinone自己的软件品牌形象。 资深IT咨询专家&浩鲸云智能专家学院院长:梅丛银

    Oinone 7天入门到精通 2024年5月23日
    1.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.1K00
  • 5.0.0升级详细说明及步骤

    注意事项 1、【重要】升级前备份base库和用户权限模块所在的库 2、【重要】升级过程执行SQL严格按照文档中写的顺序执行。特别注意:部分SQL是要求【发布前执行】,部分SQL是要求【发布后执行】 概述 该升级说明仅针对4.7.8以上版本,如正在使用4.7.8之前的版本,可根据升级说明尝试升级,或联系Oinone平台售后获取技术支持。 主要变动 rocketmq配置方式变化 依赖变化 yaml配置变化 用法发生变化 弃用canal监听binlog,改用sql-records模块 依赖变化 yaml配置变化 权限 依赖变化 用法发生变化 需执行迁移脚本 翻译 需执行迁移脚本 集成设计器 需执行迁移脚本 重要事项 本次升级需停机发布,以确保升级过程可以稳健进行。 在升级前,停机后,需妥善备份数据库,以防止无法预知的问题无法正常上线。 强烈建议在测试环境先模拟升级步骤,并根据部署环境建立自己的升级步骤文档及升级执行记录,以确保生产环境可以稳定升级。 本次升级执行的记录应妥善保留一段时间,以确保线上环境出现无法预知问题时进行修复。 升级步骤 发布前确认 admin用户或具备超级管理员的用户是否可以正常登录 是否已创建升级步骤文档及升级执行记录文档 当前时段是否允许停机发布 1. 根据版本说明中提供的版本号进行修改 PS: 下列版本号为5.0.0版本的首个稳定版本,如需要更新到最新版本,请根据5.0.x版本的更新日志查看最新版本。 <!– 平台基础 –> <pamirs.middleware.version>5.0.0</pamirs.middleware.version> <pamirs.k2.version>5.0.1</pamirs.k2.version> <pamirs.framework.version>5.0.2</pamirs.framework.version> <pamirs.boot.version>5.0.1</pamirs.boot.version> <pamirs.distribution.version>5.0.1</pamirs.distribution.version> <!– 平台功能 –> <pamirs.metadata.manager>5.0.0</pamirs.metadata.manager> <pamirs.core.version>5.0.2</pamirs.core.version> <pamirs.workflow.version>5.0.1</pamirs.workflow.version> <pamirs.workbench.version>5.0.1</pamirs.workbench.version> <pamirs.data.visualization.version>5.0.1</pamirs.data.visualization.version> 2. 所有项目工程修改依赖项 pamirs-auth-api变更为pamirs-auth3-api 原依赖项: <dependency> <groupId>pro.shushi.pamirs.core</groupId> <artifactId>pamirs-auth-api</artifactId> </dependency> 修改后的依赖项: <dependency> <groupId>pro.shushi.pamirs.core</groupId> <artifactId>pamirs-auth3-api</artifactId> </dependency> pamirs-auth-core变更为pamirs-auth3-core 原依赖项: <dependency> <groupId>pro.shushi.pamirs.core</groupId> <artifactId>pamirs-auth-core</artifactId> </dependency> 修改后的依赖项: <dependency> <groupId>pro.shushi.pamirs.core</groupId> <artifactId>pamirs-auth3-core</artifactId> </dependency> 3. 启动工程添加依赖项 <!– rocketmq –> <dependency> <groupId>pro.shushi.pamirs.framework</groupId> <artifactId>pamirs-connectors-event-rocketmq</artifactId> </dependency> <!– auth –> <dependency> <groupId>pro.shushi.pamirs.core</groupId> <artifactId>pamirs-auth3-core</artifactId> </dependency> <dependency> <groupId>pro.shushi.pamirs.core</groupId> <artifactId>pamirs-auth3-view</artifactId> </dependency> <!– auth compatible –> <dependency> <groupId>pro.shushi.pamirs.core</groupId> <artifactId>pamirs-auth-compatible</artifactId> </dependency> <!– management center –> <dependency> <groupId>pro.shushi.pamirs.core</groupId> <artifactId>pamirs-management-center</artifactId> </dependency> <!– sql-record –> <dependency> <groupId>pro.shushi.pamirs.core</groupId> <artifactId>pamirs-sql-record-core</artifactId> </dependency> 其他可能需要补充的依赖项 eip模块从core中分离出view部分代码,如有用到eip模块,则需要检查该依赖项 <dependency> <groupId>pro.shushi.pamirs.core</groupId> <artifactId>pamirs-eip2-view</artifactId> </dependency> 主POM依赖缺失可能会导致版本无法正确处理,如缺少以下依赖的,则需要补充缺失的版本管理依赖 <dependency> <groupId>pro.shushi.pamirs</groupId> <artifactId>pamirs-k2</artifactId> <version>${pamirs.k2.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>pro.shushi.pamirs</groupId> <artifactId>pamirs-framework</artifactId> <version>${pamirs.framework.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>pro.shushi.pamirs.boot</groupId> <artifactId>pamirs-boot-dependencies</artifactId> <version>${pamirs.boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>pro.shushi.pamirs.core</groupId> <artifactId>pamirs-core-dependencies</artifactId> <version>${pamirs.core.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>pro.shushi.pamirs</groupId> <artifactId>pamirs-distribution</artifactId> <version>${pamirs.distribution.version}</version> <type>pom</type> <scope>import</scope> </dependency> 4. 根据环境配置yaml spring: rocketmq: name-server: 127.0.0.1:9876 #ACL配置 #accesskey: xxxx #secretkey: xxx pamirs: boot: modules: – management_center – sql_record event: notify-map:…

    2024年5月25日
    1.5K00
  • Oinone License 许可证使用常见问题

    如何获取许可证? 联系数式运维人员获取许可证。(以下内容全部使用表示许可证文件路径) subject:授权主体名称 license.lic:许可证文件 不同许可证类别有什么不同? 许可证类型 LicenseType 限制功能 适用环境 研发授权 DEVELOP 1.每次安装时效1天,超时后无法正常访问设计器相关功能2.限制CPU和主板序列号或限制许可证使用人数3.不能用于容器启动4.有页面水印 开发环境(开发人员本地启动业务工程时使用该授权) 伙伴授权 TRIAL 1.无安装时效限制2.无部署环境限制3.有页面水印 非生产环境(测试环境、预发环境等使用该授权) 客户授权 BUSINESS 1.无安装时效限制2.仅能部署一套生产环境3.无页面水印 生产环境 PS: 一套环境是指共用Base库的所有JVM称为一套环境。 如何配置许可证? 在yaml中配置许可证 单个许可证配置 pamirs: license: subject: <subject> path: <license.lic> 多个许可证配置 pamirs: license: subject: <subject> path: – <license1.lic> – <license2.lic> pamirs.license.path可以是相对路径、绝对路径以及URL路径。 在Program Arguments中配置许可证 java -jar -Psubject=<subject> -Plicense=<license1.lic> -Plicense=<license1.lic> <boot.jar> 如何在开发中安装许可证? 将许可证放入后端运行时工作目录中即可。(一般为idea项目根目录) 如何在物理机生产环境安装许可证? 将许可证放入与jar包平级目录中即可。 如何在docker环境中安装许可证? 在docker运行时目录添加挂载卷映射,并在yaml中配置对应的路径即可。 如何获取CPU序列号和主板序列号 在Linux环境中使用dmidecode命令 # 获取CPU序列号 dmidecode -s system-serial-number # CPU序列号 7*****1 # 获取主板序列号 dmidecode -s baseboard-serial-number # 主板序列号 ..CN*******V01Y7. # 获取系统UUID dmidecode -s system-uuid # 系统UUID 4c4xxxxx-xxxx-xxxx-xxxx-xxxxxxxx5831 在Mac环境中使用system_profiler命令 # 获取CPU序列号 system_profiler SPHardwareDataType | grep 'Serial Number' | awk -F ':' '{print $2}' # CPU序列号 C02******03Y # 获取主板序列号 system_profiler SPHardwareDataType | grep 'Hardware UUID' | awk -F ':' '{print $2}' # 主板序列号 1AAxxxxx-xxxx-xxxx-xxxx-xxxxxxxxF0FC 在Windows环境中使用wmic命令 # 获取CPU序列号 wmic cpu get processorid # CPU序列号 BFExxxxxxxxxx6A3 # 获取主板序列号 wmic baseboard get serialnumber # 主板序列号 PFxxxxBY # 获取系统UUID wmic csproduct get uuid # 系统UUID D0Exxxxx-xxxx-xxxx-xxxx-xxxxxxxx78B8 在Linux环境出现dmidecode命令执行失败该如何处理? 1. 命令未找到,可使用如下方式尝试安装 # debian (eg: Ubuntu) apt-get install dmidecode # rpm (eg: Fedora/CentOS/RedHat) yum install dmidecode 2. 无权限执行命令,尝试切换当前执行用户或为当前用户提高执行权限 在docker环境出现证书安装失败该如何处理? 1. 由于docke环境非物理环境,不支持CPU序列号和主板序列号校验,尝试更换许可证。 2. 检查许可证在镜像中的位置是否与配置文件中一致。 许可证安装失败该如何处理? 1. 日志出现License installation failed.信息 PS:对JDK版本依赖的问题已在5.0.0版本以上得到完整解决,此问题仅会出现在低版本的平台版本中。 请检查jdk版本是否高于1.8_221以上。 如无法升级jdk版本的环境下,请点击下载 jce_policy-8.zip 并按照如下步骤进行操作:…

    2024年6月19日
    4.1K00

Leave a Reply

登录后才能评论