order by 排序查询多表joinSQL优化

本文探讨了SQL查询优化的问题,特别是涉及JOIN操作时性能下降的情况。通过使用子查询替代JOIN并调整ORDER BY语句,成功将查询时间从7秒降低到0.1秒。同时,还揭示了一个MyBatis-Plus分页插件导致查询变慢的陷阱,并提供了关闭自动COUNT查询以手动计算总数的解决方案,从而避免性能瓶颈。

两表数据量

	SELECT count(1) from users_customer   634485
	SELECT count(1) from action_log   1055397

正常查询

SELECT
	c.SUPER_ID superId,
	c.PHONE_NUMBER phoneNumber,
	l.LOGIN_OUT_TIME operationTime,
	l.RESULT_STATUS resultStatus,
	l.ACTION_NOTE actionNote 
FROM
	action_log l
	LEFT JOIN users_customer c ON l.USER_ID = c.ID 
WHERE
	c.SUPER_ID IS NOT NULL 
	LIMIT 1,10

稳定在0.4秒左右
---------------------------------------------------------------------------------------------------
加上排序查询后

			ORDER BY
			l.CREATE_TIME DESC

**直接7秒左右 !!! !!! !!! !! !!! **
order by 优化很难搞啊 出现了各种问题 不只是单表 因为join了设计的更多
在这里插入图片描述

优化后 的sql

   SELECT
        c.SUPER_ID superId,
        c.PHONE_NUMBER phoneNumber,
        ( CASE l.LOGIN_OR_OUT WHEN 1 THEN '登录' ELSE '登出' END ) module,
        ( CASE l.LOGIN_OR_OUT WHEN 1 THEN '登录' ELSE '登出' END ) operationType,
        l.LOGIN_OUT_TIME operationTime,
        l.RESULT_STATUS resultStatus,
        l.ACTION_NOTE actionNote
        FROM
        action_log l,
        ( SELECT * FROM users_customer ) c
        WHERE
        l.USER_ID = c.ID
                ORDER BY
        l.CREATE_TIME DESC

使用两表子查询功能 不再使用join 让他们各自走个自的索引,性能提高在0.1秒


碰到一个奇葩问题,SQL优化后还是特别慢, 最后发现mybatis-plus的分页插件会count数量

解决方法

    //关闭自动count 查询
            pager.setSearchCount(false);
            list = actionLogMapper.findCustomerLogPage(pager, dto);
            //查询count数量
            Long count = actionLogMapper.findCustomerLogCount(dto.getOperationType());
            pager.setTotal(count);

关闭自动count查询后手写一个count防止出现该问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值