分页查询接口优化

背景

业务中一个简单查询接口耗时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;
posted @ 2023-03-02 15:26  FromZeroToOne  阅读(128)  评论(0编辑  收藏  举报