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

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

如题:单表数据已经达到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或其他数据库,直接彻底解决

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

1、底层世界单片机

一、单片机简介 单片机是单片微型计算机的简称&#xff0c;MCU是Microcontroller的简称&#xff0c;也就是嵌入式微控制器。采用集成电路技术将具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、定时器/计时器、多种I/O口和中断系统等功能集成到一块硅片上。可…

漏洞扫描服务是什么

漏洞扫描服务是维护网络安全的重要一环。通过定期或实时的漏洞扫描&#xff0c;组织可以及时发现并修复可能存在的安全威胁&#xff0c;增强自身网络的安全性。在选择漏洞扫描服务时&#xff0c;需要明确自身的需求和目标&#xff0c;并选择合适的工具和服务提供商。只有这样&a…

生成对抗网络(DCGAN)手写数字生成

文章目录 一、前言二、前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09; 二、什么是生成对抗网络1. 简单介绍2. 应用领域 三、创建模型1. 生成器2. 判别器 四、定义损失函数和优化器1. 判别器损失2. 生成器损失 五、定义训练循环六、训练模型七、创建 G…

【新品上市】启扬储能管理平板,打造储能管理新模式,助力全场景储能数智化升级!

随着可再生能源的快速发展&#xff0c;储能技术的应用日益广泛&#xff0c;储能系统成为解决可再生能源波动性和不可控制性的关键环节。储能系统通过实时监测、数据分析、远程控制等智能化功能&#xff0c;实现能量的高效利用和系统的稳定运行。 启扬智能推出 工业级储能管理平…

自定义 element DatePicker组件指令 使选择器呈现为只读状态,用户无法直接编辑,但可以查看和选择日期

1.问题 现实中遇到列表的搜索条件使用DatePicker 组件进行开始结束时间筛选&#xff0c;但是手动修改input中的值&#xff0c;导致请求参数异常。比如讲clearable设置为false之后还是能手动清空输入框中的值。虽然组件提供了readonly 属性&#xff0c;但是也会让日期选择也无法…

IDEA中springboot 提示 java: 找不到符号 符号: 变量 log

在以下位置加上该配置"-Djps.track.ap.dependenciesfalse" 然后重新启动项目&#xff0c;到此问题解决&#xff01;&#xff01;&#xff01;

近期知识点

aop (1) 要求利用AOP记录用户操作日志。内容包含以下信息&#xff1a;ip地址、用户名、请求的地址&#xff0c;请求的时间 &#xff08; 4 分&#xff09; &#xff08;2&#xff09;要求利用AOP记录用户操作日志&#xff0c;日志记录到文本文件。内容包含以下信息&#xff…

如何用量化交易“做空”来获取收益

最近的市场环境相当不好&#xff0c;今年一年都没有任何主线的模式情况下去交易。更多的都是题材热点聚焦&#xff0c;而且板块轮动过快。市场环境不好的情况下&#xff0c;我们如何通过“做空”来获取收益&#xff01;量化做空是指利用计算机模型和算法&#xff0c;通过分析市…

FPGA falsh相关知识总结

1.存储容量是128M/8 Mb16MB 2.有256个sector扇区*每个扇区64KB16MB 3.一页256Byte 4.页编程地址0256 5&#xff1a;在调试SPI时序的时候一定注意&#xff0c;miso和mosi两个管脚只要没发送数据就一定要悬空&#xff08;处于高组态&#xff09;&#xff0c;不然指令会通过两…

数据爬取+数据可视化实战_哪里只得我共你(Dear Jane)_词云展示----网易云

一、前言 歌词上做文本分析&#xff0c;数据存储在网页上&#xff0c;需要爬取数据下来&#xff0c;词云展示在工作中也变得日益重要&#xff0c;接下来将数据爬虫与可视化结合起来&#xff0c;做个词云展示案例。 二、操作步骤 代码如下&#xff1a; # -*- coding:utf-8 -*-…

专家解读金融科技大势《金融科技行业2023年专利分析白皮书》发布

文/ 张翼翔 China IP 金融是国民经济的血脉&#xff0c;也是国家核心竞争力的重要组成部分。今年10月30日至31日举行的中央金融工作会议指出&#xff0c;金融要为经济社会发展提供高质量服务&#xff0c;坚持在市场化、法治化轨道上推进金融创新发展。近年来&#xff0c;人工智…

Course1-Week3-分类问题

Course1-Week3-分类问题 文章目录 Course1-Week3-分类问题1. 逻辑回归1.1 线性回归不适用于分类问题1.2 逻辑回归模型1.3 决策边界 2. 逻辑回归的代价函数3. 实现梯度下降4. 过拟合与正则化4.1 线性回归和逻辑回归中的过拟合4.2 解决过拟合的三种方法4.3 正则化4.4 用于线性回归…

知识图谱最简单的demo实现——基于pyvis

1、前言 我们在上篇文章中介绍了知识图谱的简单实现&#xff0c;最后使用neo4j进行了展示&#xff0c;对于有些情况我们可能并不想为了查看知识图的结果再去安装一个软件去实现&#xff0c;那么我们能不能直接将三元组画出来呢/ 接下来我们就介绍一个可视化的工具pyvis&#…

Python 2 和 Python 3 的区别

Python 2 和 Python 3 之间有很多重要的区别&#xff0c;特别是在处理编码、字符串和类方面的区别。Python 2和Python 3的主要区别包括以下几点&#xff1a; Unicode处理&#xff1a;Python 2有专门的Unicode字符串类型&#xff08;例如&#xff0c;u"string"&#…

Linux中的fork()函数的面试题目

1.面试题目1 (1)fork 以后&#xff0c;父进程打开的文件指针位置在子进程里面是否一样&#xff1f;(先open再fork) (2)能否用代码简单的验证一下? (3)先fork再打开文件父子进程是否共享偏移量?父进程打开的文件指针位置在子进程里面是否一样&#xff1f;能否用代码简单验证一…

Go 指针

一、关于指针 要搞明白Go语言中的指针需要先指定3个概念&#xff1a;指针地址、指针类型、指针取值 指针地址(&a)指针取值(*&a) 指针类型&#xff08;&a&#xff09; —> *int 改变数据传指针 变量的本质是给存储数据的内存地址起了一个好记的别名 比如我们…

mockito加junit gd 单元测试 笔记

目录 一、简介1.1 单元测试的特点1.2 mock类框架使用场景1.3 常用mock类框架1.3.1 mockito1.3.2 easymock1.3.3 powermock1.3.4 JMockit 二、mockito的单独使用2.1 mock对象与spy对象2.2 初始化mock/spy对象的方式2.3 参数匹配2.4 方法插桩2.5 InjectMocks注解的使用断言工具 三…

CentOS7.5搭建Hadoop-3.3.6集群的详细操作流程-实操版本

一、准备工作 1、安装 VMware&#xff0c;已安装的&#xff0c;跳过此步骤即可 官方正版VMware下载&#xff08;16 pro&#xff09;&#xff1a;https://www.aliyundrive.com/s/wF66w8kW9ac 安装&#xff1a;选一下安装地址&#xff0c;一直下一步即可。&#xff08;可能会要…

中职组网络安全-Windows操作系统渗透测试 -20221219win(环境+解析)

B-4:Windows操作系统渗透测试 任务环境说明: 服务器场景:20221219win 服务器场景操作系统:Windows(版本不详)(封闭靶机) 1.通过本地PC中渗透测试平台Kali对服务器场景Server08进行系统服务及版本扫描渗透测试,并将该操作显示结果中1433端口对应的服务版本信息作为F…

leetcode-142-环形链表(C语言实现)

题目&#xff1a; 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评…