分页查询接口优化
背景
业务中一个简单查询接口耗时25s+,排查日志发现20s都浪费在一句mybatis-plus自动生成的count sql上,原来采用mybatis-plus 的分页插件
编写的分页查询方法会自动在查询sql执行之前执行一句目标查询方法_mpCount
,该方法简单的将原来的查询结果作为子查询,外面包了一层
slect count(*) from (目标sql)
select * from data_file d
left join permission p
on d.permission_group_id = p.permission_group_id
WHERE d.file_name LIKE CONCAT('1','%')
group by d.id
ORDER BY create_time
desc LIMIT 10;
问题分析
当遇到查询结果很多时或是一些复杂查询该sql会把所有结果全部查出来进行计数,比目标sql的执行速度慢很多,因此考虑优化count SQL,禁用mybatis-plus的自动
count SQL,手动写mapper查询total
// 禁用自动count sql
page.setSearchCount(false);
// 手动count
page.setTotal(baseMapper.selectByConditionAndIdsAndUser_COUNT( request, null, userInfo));
优化后的count SQL
count SQL 目的是为了计算分页的总页数,因此只要自定义的sql计算出的比实际的大,不会影响实际使用,因此去除连表条件,
优化后的sql如下,
select * from data_file d
WHERE d.file_name LIKE CONCAT('1','%')
group by d.id
ORDER BY create_time
desc LIMIT 10;
本文作者:Joe's blog
本文链接:https://www.cnblogs.com/rise0111/p/17171955.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」