Mybatis分页插件(pagehelper)数据量稍大出现查询慢

2023-12-07 21:59

本文主要是介绍Mybatis分页插件(pagehelper)数据量稍大出现查询慢,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Mybatis分页插件(pagehelper)数据量稍大出现查询慢 🐲 芜湖~

  1. 导入Springboot依赖

    <!--分页插件-->
    <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.3.0</version>
    </dependency>
    
  2. 编写Service层核心代码

    	@Overridepublic Page<Map<String, Object>> getDeviceOrderInfo(Map<String, Integer> map) {// 此处使用PageHelp去实现的话,会在大数据量的时候查询缓慢PageHelper.startPage(map.get("page"), map.get("limit"));Page<Dev>  devInfo =devMapper.getInfo();return devInfo;}
    
  3. 编写mapper接口

        /*** @author yeqian* @param* @return* @Description TODO * @Date 2021/5/25 15:41*/Page<Map<String, Object>> getInfo();
    
  4. 编写mapper.xml

    <select id="getDeviceOrderInfo" resultType="map" useCache="true">SELECTname, age, genderFROM devInfo
    </select>
    
  5. 测试

优化查询速度🐷

⚠️在项目中使用Mybatis分页插件分页查询十分缓慢,但是在数据库中执行速度却很快?

  1. 该数据库的表共有1000条数据,分页查询时,在数据库中是毫秒级别,但是在使用Mybatis分页插件的时候居然足足!!2s多

  2. 最后打印sql

    💬无语,居然又查询了一遍,怪不得这么慢

    select count(*) from ("这里面的把sql又多重复查了一遍") tab 
    
  3. 解决办法💡

    从5.0.4版本的Mybatis分页插件之后,支持了自定义Count方法来替换原来的Count方法

官方文档

实现步骤

  1. 首先在Mapper层定义一个Count方法

    /*** @author yeqian* @param* @return* @Description TODO 查询所有的订单信息* @Date 2021/5/25 15:41*/
    Page<Map<String, Object>> getDeviceOrderInfo(Map<String, Integer> map);/*** @author yeqian* @param* @return* @Description TODO 覆盖pageHelp的计算总数方法* @Date 2021/6/3 16:57*/
    Long   getDeviceOrderInfo_COUNT();
    
  2. 在去xml中写具体sql💪

    <!--查询所有的订单详细信息-->
    <select id="getDeviceOrderInfo_COUNT" resultType="Long" useCache="false">
    SELECT
    COUNT(1)
    FROM orderInfo 
    </select>
    
  3. 再次查询,从2s的延迟降低到毫秒级:happy:

    image-20210603174342399

小结

  1. 原来是分页插件中的计算Count的sql语句,会将需要分页的所有数据查出来然后生成一个临时表,再去计算Count

  2. 如果数据量此时比较大,那么生产临时表这步因为多查询了一次表,所以会导致最后Count计算会十分慢,从而影响分页的结果。

解决办法:

​ 覆盖原Count的sql,根据官方文档,自定义。注意返回值类型(Long)与方法名(原名_COUNT)

这篇关于Mybatis分页插件(pagehelper)数据量稍大出现查询慢的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/467493

相关文章

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

SpringBoot+MyBatis-Flex配置ProxySQL的实现步骤

《SpringBoot+MyBatis-Flex配置ProxySQL的实现步骤》本文主要介绍了SpringBoot+MyBatis-Flex配置ProxySQL的实现步骤,文中通过示例代码介绍的非常详... 目录 目标 步骤 1:确保 ProxySQL 和 mysql 主从同步已正确配置ProxySQL 的

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

一文教你使用Python实现本地分页

《一文教你使用Python实现本地分页》这篇文章主要为大家详细介绍了Python如何实现本地分页的算法,主要针对二级数据结构,文中的示例代码简洁易懂,有需要的小伙伴可以了解下... 在项目开发的过程中,遇到分页的第一页就展示大量的数据,导致前端列表加载展示的速度慢,所以需要在本地加入分页处理,把所有数据先放

查询SQL Server数据库服务器IP地址的多种有效方法

《查询SQLServer数据库服务器IP地址的多种有效方法》作为数据库管理员或开发人员,了解如何查询SQLServer数据库服务器的IP地址是一项重要技能,本文将介绍几种简单而有效的方法,帮助你轻松... 目录使用T-SQL查询方法1:使用系统函数方法2:使用系统视图使用SQL Server Configu

Redis存储的列表分页和检索的实现方法

《Redis存储的列表分页和检索的实现方法》在Redis中,列表(List)是一种有序的数据结构,通常用于存储一系列元素,由于列表是有序的,可以通过索引来访问元素,因此可以很方便地实现分页和检索功能,... 目录一、Redis 列表的基本操作二、分页实现三、检索实现3.1 方法 1:客户端过滤3.2 方法

MYSQL关联关系查询方式

《MYSQL关联关系查询方式》文章详细介绍了MySQL中如何使用内连接和左外连接进行表的关联查询,并展示了如何选择列和使用别名,文章还提供了一些关于查询优化的建议,并鼓励读者参考和支持脚本之家... 目录mysql关联关系查询关联关系查询这个查询做了以下几件事MySQL自关联查询总结MYSQL关联关系查询

Java实现Elasticsearch查询当前索引全部数据的完整代码

《Java实现Elasticsearch查询当前索引全部数据的完整代码》:本文主要介绍如何在Java中实现查询Elasticsearch索引中指定条件下的全部数据,通过设置滚动查询参数(scrol... 目录需求背景通常情况Java 实现查询 Elasticsearch 全部数据写在最后需求背景通常情况下