深度分页问题优化方案

问题原因

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

相关推荐

  • 集成接口测试功能

    API、 WebService、数据库的测试功能

    2025年8月26日
    99700
  • 3.4.0版本更新说明-20230128

    版本号:3.4.0发布日期:2023.01.28更新要点: 控制页面权限时不处理内嵌视图的字段和动作 优化分布式元数据缓存逻辑 客户端动作(添加、编辑)按钮样式默认为主要按钮 修复卡片绑定倒计时字段的bug 创建枚举字段时,过滤已隐藏的数据字典 调整应用创建首页代码(事务) 1 发布概要 发布内容: 控制页面权限时,不处理字段和动作带来的内嵌视图 分布式元数据缓存bugfix 格开关带来的客户端动作(添加、编辑)按钮样式默认为主要按钮 解决卡片绑定倒计时字段的bug 创建枚举字段,选择数据字典时过滤已隐藏的数据字典 应用创建首页代码调整(事务) 2.版本信息 <pamirs.middleware.version>3.5.7</pamirs.middleware.version> <pamirs.boot.version>3.5.7</pamirs.boot.version> <pamirs.framework.version>3.5.7</pamirs.framework.version> <pamirs.k2.version>3.5.7</pamirs.k2.version> <pamirs.core.version>3.5.7</pamirs.core.version> <pamirs.tenant.version>3.5.7</pamirs.tenant.version> <pamirs.lowcode.version>3.5.7</pamirs.lowcode.version> <pamirs.designer.version>3.5.7</pamirs.designer.version> <pamirs.workflow.designer.version>3.5.7</pamirs.workflow.designer.version> <pamirs.workflow.version>3.5.7</pamirs.workflow.version> <pamirs.workbench.version>3.5.7</pamirs.workbench.version> <pamirs.designer.common.version>3.5.7</pamirs.designer.common.version> <pamirs.model.designer.version>3.5.7</pamirs.model.designer.version> <pamirs.logic.designer.version>3.5.7</pamirs.logic.designer.version> <pamirs.ui.designer.version>3.5.7</pamirs.ui.designer.version> <pamirs.data.designer.version>3.5.7</pamirs.data.designer.version> <pamirs.data.visualization.version>3.5.7</pamirs.data.visualization.version> <pamirs.distribution.version>3.5.7</pamirs.distribution.version> <pamirs.welcome.version>3.5.7</pamirs.welcome.version> <pamirs.gemini.version>3.5.7</pamirs.gemini.version> <pamirs.paas.version>3.5.7</pamirs.paas.version> 如果您有任何问题、建议或反馈,请随时联系我们。为了获得最佳体验,建议请升级至最新版本。我们将继续努力改进产品,提供更好的服务。谢谢您的支持!

    2023年1月28日
    1.1K00
  • 3.0.4版本更新说明-20220805

    版本号:3.0.4发布日期:2022.08.05更新要点: 前端优化多选上传和顶部栏功能,改进主题色和UI体验。 后端解决视频标题bug和抖音token刷新,优化存储和数据字典处理,增强模型属性联动和字段校验。这些更新将提升系统功能性和用户体验。 1 发布概要 1.1 前端 发布内容: 上传图片支持多选 上传文件支持进度条 顶部栏应用切换收起交互 登录成功跳转至上一步初始页面 1.2 后端 发布内容: 解决视频标题带#时,合成视频无法访问的bug 自动刷新用户抖音token 增加对存储名称/存储备注的处理 增加对导入的异常处理 增加对代码名称的处理 改动数据字典的修改协议 修改父模型的部分属性变动对于子模型的联动作用 字段编码唯一 字段长度补充 2.发布版本 版本信息 3.0.1 3.0.2 3.0.3 3.0.1 3.0.1 3.0.2-SNAPSHOT 3.0.6 3.0.3 3.0.1 3.1.3 3.0.3 3.0.3 3.0.1 3.0.3 3.0.6 3.0.3 如果您有任何问题、建议或反馈,请随时联系我们。为了获得最佳体验,建议请升级至最新版本。我们将继续努力改进产品,提供更好的服务。谢谢支持!

    2022年8月5日
    1.4K00
  • 4.7.8.2版本升级说明-20240327

    版本号: 4.7.8.2版本发布日期:2024.03.27更新要点:该版本是4.7.8的小版本升级。请及时更新。 4.7.8.2版本 升级内容 1、该版本是4.7.8的小版本升级 2、优化RPC接口发布 版本包信息 未使用到的版本号请忽略,按项目中使用到的进行替换 4.7.8 4.7.8.2 4.7.8.2 4.7.8.2 4.7.8.2 4.7.8.2 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 设计器镜像版本 harbor.oinone.top/oinone/designer:4.7.9.4-allinone-mini 仅包含前后端工程harbor.oinone.top/oinone/designer:4.7.9.4-allinone-full 包含中间件及前后端工程 关闭Dubbo服务注册元数据上报日志 logging: level: root: info pro.shushi.pamirs.framework.connectors.data.mapper.PamirsMapper: error pro.shushi.pamirs.framework.connectors.data.mapper.GenericMapper: error # mybatis sql日志 RocketmqClient: error org.apache.dubbo.registry.zookeeper.ZookeeperRegistry: error org.apache.dubbo.registry.integration.RegistryDirectory: error org.apache.dubbo.config.ServiceConfig: error com.alibaba.nacos.client.naming: error org.apache.dubbo.registry.nacos.NacosRegistry: error org.apache.dubbo.registry.support.AbstractRegistryFactory: error org.apache.dubbo.registry.integration.RegistryProtocol: error org.apache.dubbo.registry.client.metadata.store.RemoteMetadataServiceImpl: off org.apache.dubbo.metadata.store.zookeeper.ZookeeperMetadataReport: off org.apache.dubbo.metadata.store.nacos.NacosMetadataReport: off Naocs配置列表出现多余配置 dubbo 集成 nacos注册中心,会出现多余的配置,详细参考:配置列表会自动创建很多无关的配置: https://github.com/apache/dubbo/issues/6645配置列表出现多余的配置:https://github.com/alibaba/nacos/issues/8843 按照下面的配置可以将其关闭(📢主要是这三项配置use-as-config-center, use-as-metadata-center,metadata-report.failfast),已生成的配置需要手动删除掉。 dubbo: application: name: pamirs-demo version: 1.0.0 metadata-type: local registry: id: pamirs-demo-registry address: nacos://192.168.0.129:8848 username: nacos password: nacos # dubbo使用nacos的注册中心往配置中心写入配置关闭配置 use-as-metadata-center: false use-as-config-center: false config-center: address: nacos://192.168.0.129:8848 username: nacos password: nacos metadata-report: failfast: false # 关闭错误上报的功能 address: nacos://192.168.0.129:8848 username: nacos password: nacos protocol: name: dubbo port: -1 serialization: pamirs scan: base-packages: pro.shushi cloud: subscribed-services: 其他参考 更多4.7.8的版本说明,参考:https://doc.oinone.top/version/5183.html 如果您有任何问题、建议或反馈,请随时联系我们。为了获得最佳体验,请及时更新至最新版本。我们将继续努力改进产品,提供更好的服务。谢谢!

    2024年3月27日
    1.6K00
  • 灵活敏捷开发,高效交付项目的6个关键

    项目工程管理 项目工程顶层分层 项目分层设计,划分出 CDM层、 标准业务层 、定制业务层; 沉淀领域业务模型至CDM层; 沉底业内通用功能至标准业务层; 客户定制化功能在定制业务层; 项目内部的层级划分 项目包结构管理及规范 pamirs-demo-api constant【常量的包路径】 enums【枚举类的包路径】 model【该领域核⼼模型的包路径】 pmodel【该领域代理模型的包路径】 tmodel【该领域传输模型的包路径】 service【存放该领域的⾮存储模型如:⽤于传输的临时模型】 utils【工具类】 XXModule【该类是Demo模块的定义】 pamirs-demo-core service【接口实现类】 init【模块初始化⼯作的包路径】 manager 【manager是 service的⼀些公共逻辑,不会定义为独⽴的function的类】 pamirs-demo-view(可选) action【模型对外交互的⾏为的包路径】 项目中模块间依赖 禁止出现api模块依赖core模块的情况,api模块只允许依赖api模块; 根据当前项目结构进行模块划分,避免循环依赖; 规划项目模块 项目阶段,代码开发前,业务架构师需充分的理解需求和蓝图,对系统进行业务域, 功能域的划分;例如:对一个电商系统: 提高系统的可维护性:通过将系统拆分为不同的业务域,每个业务域都有清晰的边界和职责,可以独立开发、测试和维护; 提升开发效率:业务域划分可以使开发团队更加专注于自己负责的业务,减少不必要的沟通和协调,提升开发效率; 促进团队合作:通过业务域划分,每个团队可以负责一个或多个业务域,团队成员之间可以有更高效的合作和协同。 支持系统的扩展和演化:业务域划分可以使系统更加灵活和可扩展。当需要新增一个新的业务功能或调整现有的业务逻辑时,只需要修改对应的业务域,而不需要对整个系统进行改动。 项目文档管理 项目文档管理对于项目的实施,项目进度管理,项目后期维护等都是至关重要的。系统详细的产品文档,测试文档,运维文档,开发文档,项目管理文档等。 协同合作:团队成员可以共享和访问项目文档,促进协同合作和信息共享,避免信息孤岛和重复工作。 知识管理:项目中所获得的知识,对项目的成功和后续的知识积累至关重要。通过良好的文档管理,可以确保项目知识的保存和传承,提高组织的知识管理能力。 问题解决:项目文档中记录了项目的需求、决策、问题和解决方案等信息。当出现问题或需要做决策时,可以通过查阅文档来获取相关信息,加快问题解决的速度,并减少错误和重复。 项目追踪:通过文档管理,可以跟踪项目的进展和状态。可以记录项目的里程碑、任务分配、进度更新等信息,帮助团队了解项目的整体情况,及时发现和解决问题。 知识共享:好的文档管理可以促进知识共享和传播。通过将项目文档进行分类、索引和存档,可以使团队成员更容易找到所需的信息,并从中学习和借鉴经验,提高工作效率和质量。 数据库和事务 多表联合查询 减少需要join的操作出现 用多次查询替代 索引相关 核心业务访问DB的Sql 要命中或者覆盖索引,保存核心业务的响应时间; 控制单表的索引数量,注意联合索引 数据一致性:乐观锁控制,unique�等 事务代码示例 事务相关注意点参考【Oinone如何支持构建分布式项目】:https://doc.oinone.top/kai-fa-shi-jian/5572.html

    2024年2月20日
    1.3K00

Leave a Reply

Please Login to Comment