记录MybatisPlus使用分页查询 left Join 导致查询速度变慢

配置优化前

==> Preparing: SELECT COUNT(1) FROM sys_log sl LEFT JOIN sys_user su ON sl.user_id = su.org_user_id
==> Parameters:
==> Preparing: SELECT sl.id , sl.user_id , sl.operation, sl.method , sl.params , sl.time , sl.ip , sl.create_date , sl.os,sl.user_type , su.username as username , su.org_id AS orgId FROM sys_log sl LEFT JOIN sys_user su on sl.user_id = su.org_user_id LIMIT ?,?
> Parameters: 0(Long), 10(Long)
<
Total: 10

配置优化后

==> Preparing: SELECT COUNT(1) FROM sys_log sl
==> Parameters:
==> Preparing: SELECT sl.id , sl.user_id , sl.operation, sl.method , sl.params , sl.time , sl.ip , sl.create_date , sl.os,sl.user_type , su.username as username , su.org_id AS orgId FROM sys_log sl LEFT JOIN sys_user su on sl.user_id = su.org_user_id LIMIT ?,?
> Parameters: 0(Long), 10(Long)
<
Total: 10

示例工程:

<!-- spring xml 方式 -->
<property name="plugins">
    <array>
        <bean class="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor">
            <property name="sqlParser" ref="自定义解析类、可以没有"/>
            <property name="dialectClazz" value="自定义方言类、可以没有"/>
            <!-- COUNT SQL 解析.可以没有 -->
            <property name="countSqlParser" ref="countSqlParser"/>
        </bean>
    </array>
</property>

<bean id="countSqlParser" class="com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize">
    <!-- 设置为 true 可以优化部分 left join 的sql -->
    <property name="optimizeJoin" value="true"/>
</bean>

//Spring boot方式
@Configuration
@MapperScan("com.baomidou.cloud.service.*.mapper*")
public class MybatisPlusConfig {

    // 旧版
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认false
        // paginationInterceptor.setOverflow(false);
        // 设置最大单页限制数量,默认 500 条,-1 不受限制
        // paginationInterceptor.setLimit(500);
        // 开启 count 的 join 优化,只针对部分 left join  
        paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
        return paginationInterceptor;
    }
    
    // 最新版
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
        return interceptor;
    }
    
}

版权声明:本文为ououaoligei原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。