Pagehelper自定义count查询及其优化

一、概述

PageHelper是国内非常优秀的一款开源的mybatis分页插件,它支持基本主流与常用的数据库,例如mysql、oracle、mariaDB、DB2、SQLite、Hsqldb等。

本文主要记录该插件的非常规用法,其中包括自定义COUNT查询语句,COUNT查询优化等。

二、场景示例

PageHelper默认情况下会帮我们根据查询语句自动生成COUNT查询SQL,但是有些情况下,PageHelper自动生成COUNT查询SQL存在效率问题。比如,其中使用了GROUP BY语句。生成的COUNT查询SQL查询效率很慢。

PageHelper自动生成的SQL

-- 查询SQL
SELECT
	a.field
FROM
	page_view_statistics a
GROUP BY
	a.field 
ORDER BY
	view_count DESC 
LIMIT 20

-- 自动生成的COUNT查询SQL
SELECT
	count( 0 ) 
FROM
	(
	SELECT
		a.field
	FROM
		page_view_statistics a
	GROUP BY
	    a.field 
	) table_count

上述由PageHelper插件自动生成的COUNT查询SQL,由于进行了一层嵌套,并且SQL中也加入了GROUP BY语句,导致查询效率很慢。

因此我们需要自定义COUNT查询SQL,不要用插件自动生成的SQL。

三、自定义COUNT查询SQL

PageHelper插件允许我们自定义COUNT查询SQL,定义方法就是,新增一个select查询语句,查询对应COUNT,查询标签的ID命名为原来的查询语句标签ID + _COUNT。示例如下。

自定义COUNT查询SQL示例

<!-- 查询SQL -->
<select id="findListGroupContentId" parameterType="PageViewStatistics" resultMap="qpResult">
    SELECT
        a.field
    FROM
        page_view_statistics a
    GROUP BY
        a.field 
</select>
<!-- 自定义COUNT查询SQL -->
<select id="findListGroupContentId_COUNT" parameterType="PageViewStatistics" resultType="Long">
    SELECT
        count(DISTINCT a.field )
    FROM
        page_view_statistics a
</select>

根据上述方法定义之后,PageHelper插件就会根据我们自定义的COUNT查询SQL进行分页总数的查询了。

四、PageHelper.count()方法的使用

很多业务场景下,我们需要单独进行COUNT查询,这种情况下,如果在Mapper文件里面再单独写一个查询方法,会显得代码很冗余,方法复用性不高。

PageHelper插件提供了只执行COUNT查询的方法。示例如下。

PageHelper.count()使用示例

// Mapper层接口, 对应上面的SQL
List<Entity> findListGroupContentId(Entity entity);

// 单独执行COUNT查询
PageHelper.count(() -> findListGroupContentId(entity));

五、PageHelper.orderBy()方法的使用

同理,除了需要进行单独COUNT查询之外,我们有时也需要对SQL查询的数据进行排序。

PageHelper.orderBy方法可以帮我们把排序的功能从Mapper文件中分离出来。

PageHelper.orderBy()使用示例

// 直接调用即可,传入需要排序的字段,也可以跟分页一起用。
PageHelper.orderBy("sort asc");

六、分页不执行count

如果我们需要查询特定几条数据,但是又不希望分页前执行count查询语句,可以按照如下方法操作即可。

只分页示例

// 将count设置成false即可
Page<Entity> temp = PageHelper.startPage(1, 1, false);
PageHelper是一个用于实现分页功能的插件。在处理大量数据时,PageHelper可能会出现性能问题。可以通过优化PageHelpercount方法来提高查询性能。在使用PageHelper时,可以根据业务场景和数据复杂性等因素,决定是否需要进行count优化优化count方法可以改善查询效率。另外,PageHelper的分页功能是通过Limit拼接SQL实现的。通过分析和优化SQL语句,也可以进一步提高查询性能。希望这些信息对你有所帮助。如果有任何问题和建议,请随时提出。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [浅谈PageHelper插件分页实现原理及大数据量下SQL查询效率问题解决](https://blog.csdn.net/baidu_38083619/article/details/82463058)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [分页插件PageHelper的使用及优化](https://blog.csdn.net/leeta521/article/details/118963109)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值