一个大sql,其中一个条件
处理方式1:
不使用子查询比如
code=‘123’执行 70ms
处理方式2:
带子查询条件,比如
code in(select xxx from table where xxx)
其中子查询sql
select xxx from table where xxx 单独执行100ms
结果也是就一个值‘123’场景
这种方式执行时间18s;
疑问:业务场景中无法避免使用方式2 只能使用动态数据去获取code范围,用户量上来后同时调用此接口后数据库就撑不住了,问下大神怎么去调整一下这个方式让sql跑的更快呢
针对您提到的SQL执行效率问题,特别是在必须使用子查询来动态获取code
范围的情况下,以下是一些基于参考资料的专业建议来优化您的查询性能:
使用JOIN替换IN子查询
根据参考资料,当子查询返回结果较多时,可以考虑使用JOIN来替代IN子查询。这不仅能够避免因返回结果超过限制而导致的错误,还能在某些情况下提高查询效率。示例如下:
SELECT a.*
FROM table_a a
JOIN (
SELECT DISTINCT col1
FROM table_b b
WHERE xxx
) c ON a.code = c.col1;
注意:如果业务上保证子查询结果中col1
列值无重复,可移除DISTINCT
关键字以进一步提升性能。
table_b
中用于筛选xxx
条件的列以及最终JOIN操作中使用的列,应确保它们被索引覆盖,以减少扫描成本。exhaustive2
算法通常能找到最优解,但在表数量较大时优化耗时较长。在某些场景下,可以尝试使用greedy
算法减少优化器耗时,尽管这可能不会产生最优计划。NOT IN
,并考虑将其改写为NOT EXISTS
形式。综上所述,通过上述策略的综合应用,可以在很大程度上优化包含子查询的大SQL执行效率,减轻数据库压力,尤其是在用户量增加的场景下。务必根据实际的表结构、数据分布和查询需求,灵活选择和调整优化措施。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。