mysql mybatis分页查询 大数据量 非常慢

news2024/9/22 13:24:15

 查阅了很多博客和资料,这篇文章以思路为准,详细代码不细说,都是非常简单的方法,一看就明白。具体实现稍微百度一下就能出来。仅供参考。

如题:单表数据已经达到4千万条数据,通过mybatis的分页查询效率非常低下。       

当然,前提是索引什么的优化已经都存在并且命中的情况下。所以就不分析索引的问题了。 

原因:mybatis分页查询会执行两次sql

第一次:select count(1) from table where ?? 

这一步非常慢,如果结果是万级别的数据,估计会4-5s以上,数据越多,时间逐渐增加

第二次:select * from table where ?? limit ?,?  这一步很快,就算是结果集总数达到二十多万,速度也可以保持在毫秒级别

分析结果:

第一:count()有优化空间的直接优化

第二:count()没办法优化的,只能从业务入手

总结:

第一:针对count()有优化空间的如下

(1):重写count()覆盖自带count()

        如果是连表查询的速度慢,可以重写mybatis Page的count方法,具体操作就是在xml文件里面定义一个count查询方法,大概类似如下:

为什么说这个方法对于连表查询有用呢,是因为连表查询,sql比较复杂,通过自带的count肯定查询条件一致,但是自定义的话就只查询主表数量就足够了,不需要连表进行count

但是这个局限性比较大,如果条件里面有table2的条件就没办法了。

【代码里面】

page.setCountId("selectAll_COUNT");

【xml里面】

<select id="selectAll" resultType="xxxxxx">
        select * from table1 left table2 on table1.userId = table2.id where ....
</select>
 
<select id="selectAll_COUNT" resultType="java.lang.Long">

        select count(1) from table1 where ....
</select>

(2):缓存获取count()

        这个需要看业务需求,如果业务上面对于总数实时性要求不高,或者总数变化不快的情况下可以使用。具体实现方法就是

通过设置setSearchCount=false,关闭mybatis自动查询总数的开关。

carFlowInfoPageDTOPage.setSearchCount(false);

然后自定义一个查询count的方法,在接口上面添加上@cacheable注解(具体实现自行百度),如果下一次查询的条件和上次的条件一致,则直接返回结果,就不需要跟数据库进行交互。

缺点:不同的查询条件第一次查询或者缓存时间到期后再次查询肯定还是慢,而且实时性较差。但是根据系统情况来看,如果对于实时性要求不高的,可以选择使用。无伤大雅

(3):不推荐

看了很多帖子,要么就是数据库记录数据、或者来一条数据更新一下总数、或者多线程一个查询列表一个程序总数等等,这些方法都不适用于正常的待条件分页查询,可以忽略。

第二:count()没办法优化的,只能从业务入手

(1):前后端一起优化--推荐

可以跟公司的产品进行沟通,如果可以去掉总数显示,分页上面只显示上一页下一页的话,就可以用下面这个方法。比较推荐。

效果就是前后端一起优化:

首先后端设置:

carFlowInfoPageDTOPage.setSearchCount(false);

结果就是返回的page结果里面没有totalcount。

前端可以根据条件修改分页插件,一直可以点击下一页,如果当前页返回的数量<pageSize,则表示当前是最后一页。或者如果当前页查询数据为空,则把页数调整至上一页但不能<1的情况下再请求一次即可。

如下图,参考一下即可。

(2):异步查询加载

还是carFlowInfoPageDTOPage.setSearchCount(false); 返回结果没有totalcount

但是后端增加一个查询count的接口

也就是点击一次请求查询两个接口。list接口肯定很快返回,可以直接进行列展示,供用户操作查看等;

count接口返回较慢,分页插件下面展示loading(提示正在加载)

当然上面的方法都做了一定的妥协,彻底解决:

引入ES或其他数据库,直接彻底解决

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1273016.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何提高销售技巧,增加客户的成交率?

如何提高销售技巧&#xff0c;增加客户的成交率&#xff1f; 在如今的市场环境中&#xff0c;销售技巧的高低往往决定了你是否能够成功地打动客户的心。想要提高销售业绩&#xff0c;除了产品质量和服务的保障&#xff0c;更需要你精进销售技巧&#xff0c;从而让客户愿意为你…

一种快速设计射频功放IC流程分享

No.1设计目标 在功率放大器PA中&#xff0c;输出级以及输出匹配决定了该功放的线性度、效率等关键性能指标&#xff0c;通常被优先考虑。在这个项目中输出级功放关键性能指标如下&#xff1a; 带宽&#xff1a;12-13 GHz OP1dB>13dBm 输出级 Power gain>5dB DE_P1dB&…

TCP解帧解码、并发送有效数据到FPGA

TCP解帧解码、并发送有效数据到FPGA 工程的功能&#xff1a;使用TCP协议接收到网络调试助手发来的指令&#xff0c;将指令进行解帧&#xff0c;提取出帧头、有限数据、帧尾&#xff1b;再将有效数据发送到FPGA端的BRAM上&#xff0c;实现信息传递。 参考&#xff1a;正点原子启…

基于springboot实现的在线考试系统

一、系统架构 前端&#xff1a;html | js | css | jquery | bootstrap 后端&#xff1a;springboot | springdata-jpa 环境&#xff1a;jdk1.7 | mysql | maven 二、 代码及数据库 三、功能介绍 01. 登录页 02. 管理员端-课程管理 03. 管理员端-班级管理 04. 管理员端-老师管理…

【CAN通信】CanIf模块详细介绍

目录 1.内容简介 2.CanIf详细设计 2.1 CanIf功能简介 2.2 一些关键概念 2.3依赖的上下层模块 2.4 功能详细设计 2.4.1 Hardware object handles 2.4.2 Static L-PDUs 2.4.3 Dynamic L-PDUs 2.4.4 Dynamic Transmit L-PDUs 2.4.5 Dynamic receive L-PDUs 2.4.6Physi…

微信小程序 - 开发版、体验版、正式版共享本地缓存

问题描述 最近突然发现一个大问题啊&#xff0c;小程序切换版本环境的时候发现数据被污染了&#xff0c;瞬间就怀疑不同环境版本的小程序本地缓存是否共享的&#xff1f;&#xff01; 果然是&#xff01; 解决方案 我们可能马上想到解决方案就是&#xff1a;给每一个环境版本…

不想花钱用aspera?这些免费的替代方案也同样快速哦

Aspera FASP是一款高速数据传输软件&#xff0c;被广泛应用于大文件的快速传输。然而&#xff0c;Aspera FASP并不便宜&#xff0c;对于一些小型企业或个人用户来说可能无法负担。因此&#xff0c;为了满足大家的需求&#xff0c;本文将介绍一些免费且同样快速的Aspera替代方案…

【meta】Scaling Speech Technology to 1,000+ Languages

nvidia-NeMo包含TTS的模型&#xff0c;开源数据 uroma转写工具介绍 uroman转写工具 N-to-M mapping 转写的规范&#xff0c;包含一些中文-拼音&#xff0c;拉丁文-读法的规则转换。字符串匹配规则下的查字典&#xff1b; 将字母对应到发音单元 转写规范 转写过程尽量做到可…

Android Studio初学者实例:Fragment学习--仿美团外卖界面

本次课程为Fragment为主题&#xff0c;课程的示例仿美团外卖界面&#xff0c;不同于底部导航栏的Fragment案例&#xff0c;此界面分为左侧切换与顶部切换。本文先是发布代码与效果&#xff0c;后续讲解将会在后续补充。先看看效果&#xff1a; 首先是布局文件代码&#xff1a;A…

GPT带我学Openpyxl操作Excel

注&#xff1a;以下文字大部分文字和代码由GPT生成 一、openpyxl详细介绍 Openpyxl是一个用于读取和编写Excel 2010 xlsx/xlsm/xltx/xltm文件的Python库。它允许您使用Python操作Excel文件&#xff0c;包括创建新的工作簿、读取和修改现有工作簿中的数据、设置单元格格式以及编…

Typora切换字体颜色

欢迎大家到我的博客浏览。Typora切换字体颜色 | YinKais Blog最近很无聊&#xff0c;突然想起来朋友的 Typora 可以修改字体颜色&#xff0c;而我的却不能&#xff0c;我就去研究了一下&#xff0c;于是有了这一篇教学文章。 可能会有人说&#xff0c;网上大佬早有教学了&…

提升Jmeter测试效率的9种参数化方法!

jmeter工具无论做接口测试还是性能测试&#xff0c;参数化都是一个必须掌握且非常有用的知识点。参数化的使用场景: 1&#xff09;多个请求都是同一个ip地址&#xff0c;若服务器地址更换了&#xff0c;则脚本需要更改每个请求的ip 2&#xff09;注册账号&#xff0c;不允许账…

群晖NAS配置之搭建WordPress个人博客站点

群晖NAS配置之搭建WordPress个人博客站点 之前写了一些ngrok和frp给群晖nas做内网穿透&#xff0c;今天分享一下在群晖nas下安装wordpress的教程。 WordPress是一个开源的内容管理系统&#xff08;CMS&#xff09;&#xff0c;最初是用来搭建博客的&#xff0c;但后来发展成为…

离线直线度测量仪的适用范围!

离线直线度测量仪虽是智能测量设备&#xff0c;但与在线检测设备相比&#xff0c;检测速度还是较慢&#xff0c;但非常适用于需要使用的圆形轧材抽检或全检&#xff0c;生产产线不适合安装在线仪器的的厂家。 离线直线度测量仪主要用于金属棒材、管材、陶瓷管材、压辊、轧辊等产…

浅谈集中控制式预付费抄表系统设计与应用

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 摘要:介绍一种由射频卡预付费和RS485总线组成的集中控制式预付费抄表系统,系统能准确及时地釆集处理电能计量数据并实现预付费功能。该系统简化用户电能表设计&#xff0c;使智能集中控制器具有多功能化&#xff0c;实现系统…

WP采集插件的进阶功能:输入关键词采集及定向采集实现精准筛选

WP采集插件教程&#xff1a;轻松实现全网文章采集 近年来&#xff0c;WordPress&#xff08;简称WP&#xff09;作为一款强大的网站建设工具&#xff0c;广受用户喜爱。然而&#xff0c;对于许多网站管理员来说&#xff0c;如何轻松而高效地获取全网各类文章内容成为了一个亟待…

PCB布线为什么不能走直角或锐角-笔记

PCB布线为什么不能走直角或锐角-笔记 摘要一.PCB走线在直角转弯的地方&#xff0c;信号前后部分相互影响这几个理由我们来一一分析一下传输线的直角带来的寄生电容从阻抗的角度来看直角的尖角产生放电或者电磁辐射走线直角的工艺问题 摘要 有一定熟悉画过PCB板的人或者PCB教学…

VMware通过ISO镜像安装window2016虚拟机

1.点文件->新建虚拟机 2.进入到下边页面 3.根据你的服务器硬件选择硬件兼容性 4.选择2016版本的windows(注&#xff1a;没有该版本的话选择最高版本) 5.根据你的需求选择引导设备( 启动过程&#xff1a; BIOS&#xff1a; 在计算机启动时&#xff0c;BIOS负责进行自检&#…

MySQL如何处理并发访问和高负载?

在当今互联网时代&#xff0c;面对日益增长的数据量和用户访问量&#xff0c;数据库的并发访问和高负载处理变得尤为重要。MySQL作为最流行的关系型数据库管理系统之一&#xff0c;具备许多关键技术和策略来处理并发访问和高负载&#xff0c;下面将对其进行深入探讨。 ​ 图片…

开关电源工作时,如何抑制纹波和减小高频噪声?

开关电源的纹波和噪声是一个本质问题&#xff0c;换而言之无论纹波和噪声多么小&#xff0c;也无法从根本上去除&#xff0c;再绝对的讲开关电源无论成本怎么提高&#xff0c;也无法完全达到线性电源的性能和特点。那么&#xff0c;通常抑制或减少它的做法有五种&#xff1a; …