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

741

被折叠的 条评论
为什么被折叠?



