MySQL调优学习笔记(五):子查询

时间: 2024-05-20 admin IT培训

MySQL调优学习笔记(五):子查询

MySQL调优学习笔记(五):子查询

参考资料:姜承尧的MySQL实战宝典

子查询性能提升

MySQL 8.0 版本中,子查询的优化得到大幅提升。优化器会自动地将子查询优化为最佳的 JOIN 执行计划,这样一来会显著的提升性能。所以放心大胆地在MySQL8.0 中使用子查询吧!

子查询 中IN 和 EXISTS,哪个性能更好?

主要看执行计划。如果两者执行计划完全一样,性能没有任何差别。

依赖子查询的优化

在 MySQL 8.0 版本之前,对于子查询的优化并不充分。所以在子查询的执行计划中会看到 DEPENDENT SUBQUERY 的提示,这表示是一个依赖子查询,子查询需要依赖外部表的关联。DEPENDENT SUBQUERY 执行速度可能非常慢。

对于依赖子查询的优化,就是要避免子查询由于对外部表的依赖,而需要对子查询扫描多次的情况。所以可以通过派生表的方式,将外部表和子查询的派生表进行连接,从而降低对于子查询表的扫描,从而提升 SQL 查询的性能。

总结

  • 子查询相比 JOIN 更易于被人类理解,所以受众更广,使用更多;
  • MySQL 8.0 版本可以放心大胆地写子查询,对于子查询的优化已经相当完备;
  • 子查询 中IN 和 EXISTS,哪个性能更好?主要看执行计划。

  • 对于老版本的 MySQL,请回顾所有子查询的SQL执行计划, 对于出现 DEPENDENT SUBQUERY 的提示,请务必进行优化,否则对业务将造成重大的性能影响。DEPENDENT SUBQUERY 的优化,一般是重写为派生表进行表连接。