深度分页问题优化方案

问题原因

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

相关推荐

  • 后端学习路径

    准备工作 -1h 后端研发环境安装后端研发环境,需要idea和oinone插件,git和maven 设置指南为学习教程进行的一些准备 后端基础 1.1.1整体介绍 -0.5h– 模块(module)定义– 模块(Module)结构– Oinone版本 1.1.2 新建一个应用 -1.5h为创建一个全新的 Oinone 模块奠定基础。从零开始,仅使用让 Oinone 识别我们模块所需的最少元素。包括: — 新建费用管理模块– 定义Oinone的费用模块– 配置启动工程的YAML文件 1.1.3 模型与基础字段 -3h– 对象关系映射ORM– 模型基础字段 1.1.4 安全简介 -3h配置模型的菜单入口和对应角色的权限(访问权限和数据权限) — 菜单入口– 用户与角色– 访问权限配置 1.1.5 界面实操-3h通过配置字段的一些新属性和UX属性改变页面交互 –字段一些新属性–UX属性 1.1.6 基础视图-3h–表格视图–表单视图–详情视图 1.1.7 模型建关系-8h–多对一关系(many2one)–多对多关系(many2many)–一对多关系(one2many) 1.1.8 字段间联动-5h–关系字段属性:domain–UX的一些新属性,包括:compute、constructFun 1.1.9 准备学习行为-3h–单记录操作–批量操作 1.1.10 约束-1h–SQL约束–校验约束–UI交互约束 1.1.11 追加细节 -3h–内联视图–组件widget–表格排序 1.1.12 继承-2h–函数的重写–模型的继承 1.1.13 模块间相互作用-2h–link模块 1.1.14 产品的个性化开发-4h–模块的upstream属性–函数特性,包括扩展点、拦截器 后端进阶 2.1.1 调试工具-1hOinone 提供的调试工具是一款支持在浏览器页面直接进行 页面调试 与 接口调试 的效率工具。 2.1.2 界面设计器-4h界面设计器提供了直观的可视化界面,允许用户通过拖拽和配置组件的方式来构建应用界面,而无需依赖传统的手写大量代码的方式。这种设计器旨在简化界面开发过程,提高开发效率,同时确保界面的美观和易用性。

    2025年9月1日
    1.4K00
  • Oinone项目引入Nacos作为配置中心

    Oinone项目引入nacos作为配置中心 Oinone项目配置默认读取的项目中yml文件(application-xxx.yml), 实际项目中有可能要求项目的配置放到Nacos配置中心中; Oinone默认引入的nacos-client-1.4.1,低于1.4.1的版本不支持认证配置;1.4.1的客户端版本支持Nacos服务端1.x的和2.x的版本; 一、项目中增加依赖 项目主pom引入依赖(最新版平台已默认引入), Nacos版本要求1.4.1以上,低版本不支持认证配置 <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>2021.1</version> </dependency> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>1.4.1</version> </dependency> 项目的boot工程的pom引入依赖(最新版平台已默认引入) <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> </dependency> 二、项目工程bootstrap配置 bootstrap.yml文件的配置修改为: spring: application: name: hr-simple # 替换为实际服务名 profiles: active: wx # 指定 profile cloud: config: enabled: false nacos: discovery: enabled: false config: server-addr: 127.0.0.1:8848 enabled: true # namespace: # 如果使用 public 命名空间,建议省略此行 # namespace: your-custom-namespace-id # 如果使用自定义命名空间,填写其 ID group: DEFAULT_GROUP # prefix: # 通常省略,使用默认的 spring.application.name file-extension: yaml # 推荐使用 yaml,而不是 yml (虽然通常兼容) timeout: 5000 #【可选】修改为和nacos一致即可(如果服务端未开启可以不用配置) # username: wangxian # password: wangxian 三、Naocs服务端配置 在Nacos服务端的对应的namespace(5a8b3710-a9a2-4f7c-932f-50f326cb1ccf)下增加配置,把原本配置在代码中的(application-xxx.yml)配置到Nacos中

    2024年2月28日
    2.4K00
  • oio-dropdown 下拉菜单

    向下弹出的列表。 何时使用 当页面上的操作命令过多时,用此组件可以收纳操作元素。点击或移入触点,会出现一个下拉菜单。可在列表中进行选择,并执行相应的命令。 用于收罗一组命令操作。 Select 用于选择,而 Dropdown 是命令集合。 API 属性如下 参数 说明 类型 默认值 destroyOnHide 关闭后是否销毁 Dropdown boolean false disabled 菜单是否禁用 boolean – getTriggerContainer 菜单渲染父节点。默认渲染到 body 上,如果你遇到菜单滚动定位问题,试试修改为滚动的区域,并相对其定位。 Function(triggerNode) () => document.body overlay(v-slot) 菜单 Menu – overlayClassName 下拉根元素的类名称 string – overlayStyle 下拉根元素的样式 object – placement 菜单弹出位置 bottomLeft | bottom | bottomRight | topLeft | top | topRight bottomLeft trigger 触发下拉的行为, 移动端不支持 hover Array<click|hover|contextmenu> ['hover'] visible(v-model:visible) 菜单是否显示 boolean – 事件 事件名称 说明 回调参数 onUpdateValue 菜单显示状态改变时调用,参数为 visible。点击菜单按钮导致的消失不会触发 function(visible)

    2023年12月18日
    2.0K00
  • 前端日期组件国际化支持方案

    在 oinone 平台中,系统默认支持基础的国际化翻译功能。但由于日期时间组件的国际化依赖对应语言包,而全量引入语言包会显著增加打包体积,因此前端默认仅集成了中、英文的日期时间支持。若需为日期时间组件扩展其他语言(如日语)的国际化支持,需手动导入对应语言包并完成配置,具体步骤如下: 假设我们现在国际化翻译切换成了日语,那么我们在日期时间也要支持日语,那么需要如下操作: 1: 重写 RootWidget 继承平台默认的 RootWidget,SPI 注册条件保持跟平台一致即可覆盖平台默认的RootWidget // CustomRootWidget.ts import { RootComponentSPI, RootWidget, SPIFactory } from '@oinone/kunlun-dependencies'; import Root from './Root.vue'; // 通过SPI注册覆盖平台默认的root组件 @SPIFactory.Register(RootComponentSPI.Token({ widget: 'root' })) export class CustomRootWidget extends RootWidget { public initialize() { super.initialize(); this.setComponent(Root); return this; } } 2: 覆盖 Root 组件的 Vue 文件 自定义的 Vue 文件需负责导入目标语言(如日语)的语言包,并根据当前语言环境动态切换配置。这里需要同时处理 ant-design-vue、element-plus 组件库及 dayjs 工具的语言包,确保日期组件的展示和交互统一适配目标语言。 <!– Root.vue –> <template> <a-config-provider :locale="antLocale"> <el-config-provider :locale="eleLocale"> <match :rootToken="root"> <template v-for="page in pages" :key="page.widget"> <route v-if="page.widget" :path="page.path" :slotName="page.slotName" :widget="page.widget"> <slot :name="page.slotName" /> </route> </template> <route :path="pagePath" slotName="page" :widgets="{ page: widgets.page }"> <slot name="page" /> </route> <route path="/" slotName="homePage"> <slot name="homePage" /> </route> </match> </el-config-provider> </a-config-provider> </template> <script lang="ts"> import { CurrentLanguage, EN_US_CODE, UrlHelper, ZH_CN_CODE } from '@oinone/kunlun-dependencies'; import { ConfigProvider as AConfigProvider } from 'ant-design-vue'; import { ElConfigProvider } from 'element-plus'; import dayjs from 'dayjs'; // 导入ant-design-vue语言包 import enUS from 'ant-design-vue/es/locale/en_US'; import zhCN from 'ant-design-vue/lib/locale/zh_CN'; import jaJP from 'ant-design-vue/lib/locale/ja_JP'; // 新增:日语语言包 // 导入 dayjs的语言包 import 'dayjs/locale/zh-cn'; import 'dayjs/locale/ja'; // 新增:日语语言包 // 导入element-plus语言包 import elEn from 'element-plus/dist/locale/en.mjs'; import elZhCn from 'element-plus/dist/locale/zh-cn.mjs'; import elJaJP from 'element-plus/dist/locale/ja.mjs'; // 新增:日语语言包 import { computed, defineComponent, onMounted,…

    2025年8月13日
    1.0K00
  • 前端更新日志(v4)【最后更新于20230713】

    版本号:v4.5.0发布日期:2023.07.13更新要点:表格列宽拖动后会默认存储/可以自定义路由设置和导航功能/可以自定义遮罩效果和显示内容,请及时更新 v4.5.0 新特性 table列宽拖动后会默认存储 自定义路由新增了RouterWidget 自定义Mask新增了MaskWidget v4.3.0 新特性 支持多tabs选项卡 MessageHub改造 统一母版父类,将LayoutWidget改为MaskWidget。提供reloadMaskProcess/reloadMainViewProcess方法进行母版组件刷新,母版组件不再使用流相关功能。 不兼容升级内容 MessageHub改造:原使用useMessageHub方法的返回类型改为IMessageHub,IMessage#publish方法入参类型改为IMessage。 原AppSwitcher.ts改为AppSwitcherWidget.ts,新增AppSwitcher的Vue Component导出。 原代码 import { AppSwitcher, … } from ‘@kunlun/dependencies’; @SPI.ClassFactory(ViewWidget.Token({ widget: ‘app-switcher’ })) export class CustomAppSwitcherWidget extends AppSwitcher {} 新代码 import { AppSwitcherWidget, … } from ‘@kunlun/dependencies’; @SPI.ClassFactory(ViewWidget.Token({ widget: ‘app-switcher’ })) export class CustomAppSwitcherWidget extends AppSwitcherWidget {} 修改VueOioProvider的http相关参数,将原有network-interceptor内置到平台,如无修改,可直接移除。具体修改事项联系开发人员提供技术支持。参考文档 发布日志 20230713 表格中的,整数、浮点数、长整数的表头文字默认靠左对齐 20230620 优化表格的富文本预览 表单、详情页面的基础字段默认colSpan=1 修复多对一关联关系字段无法清除的问题 修复登出时浏览器标题异常的问题 20230617 修复菜单未正确排序的问题 隐藏搜索字段的必填标识 支持http中对queryWrapper的rsql字段base64编码 修复「编辑页面」的「枚举字段」「清空」后,没有提交 20230608 新增列宽主题配置 表格数字组件全部使用右对齐,包括表头右对齐;(原仅有金额右对齐,新增整数、浮点数等右对齐) 修复树下拉组件搜索异常的问题 修复vxe-table版本异常问题(从v4.3.9 -> v4.3.6) 修复模型设计器「图模式」多次点击「编辑字段」不生效 修复图模型「列模型」,全部选择table后,删除字段action不出现的问题 20230602 修复根视图的name属性无法正确获取的问题 修复树下拉组件在多选的情况下,超出展示范围的样式问题 修复树下拉组件在设置了提交函数时,节点异常收起的问题 修复搜索表单默认值在某些情况下无法正确回填的问题 优化工作台搜索区悬停样式的问题 修复界面设计器子菜单排序在多次排序后失灵的问题 修复流程设计器表达式无法正确获取数据类型的问题 20230531 修复表格日期范围字段无法通过用户偏好隐藏的问题 修复树下拉在获取数据未返回进行搜索时,导致最终结果错误的问题 修复界面设计器子菜单拖放到首个的情况下,排序异常的问题 修复tabs超出高度没有滚动条的问题 20230529 请求头添加module参数,传递url上的module参数 修复表单自动填充的问题 修复表格seq序号列不显示的问题 20230524 修复network-interceptor在某些情况下出现npe的问题 修复模板解析时出现报错问题 修复列表排序字段重复的问题 移除关联关系字段排序功能 20230519 修复oio-input、oio-passwod、oio-input-search自动填充的问题 修复项目中修改主题不生效 修复表格关联字段排序,使用关联模型的labelFields作为排序条件。 修复在某些情况下,related字段npe问题。 变更【树表】选中左侧树节点时,重置表格当前分页。 如果您有任何问题、建议或反馈,请随时联系我们。为了获得最佳体验,建议请升级至最新版本。我们将继续努力改进产品,提供更好的服务。谢谢!

    2023年11月1日
    1.2K00

Leave a Reply

Please Login to Comment