记MySQL下一次DEPENDENT SUBQUERY的优化

原查询大致为:

sql 复制代码
select a.field1,a.field2,a.field3,case (select count(1) from b where b.field1 = a.field4 and b.field2 = 'xxx'...) > 0 then 1 else 2 end
from a
where a.field1 = 'xxx' and a.filed2 = 'xxxx' and case (select count(1) from b where b.field1 = a.field4 and b.field2 = 'xxx'...) > 0 then true else false end

通过explain 后,参数如下:

  • select_type: DEPENDENT SUBQUERY
  • type: index

a表数据正常走索引无需考虑,原因后述;

b表索引配置顺序如下:

联合索引(field1 ,field12,field13,field14)

查询速度大致为30秒,a表与b表均为3万到5万条

处理结果

调整b表索引顺序为:联合索引(field12,field13,field14,filed1)

调整后查询速度为1点几秒

原因分析

由于此种关联子查询方式执行逻辑为,先查询外表,后根据外表结果集依次遍历内表,虽然走索引,但仍然为全索引扫描,速度并没有提升。

故外表a无需考虑,只需要将内表b索引调整,将field1字段索引调后或删除,令b表先进行数据过滤,这样可以减少a表遍历时内循环b表数据集的数据量,从而提升速度。

相关推荐
auspicious航1 小时前
PostgreSQL数据库关于pg_rewind的认识
数据库·postgresql·oracle
最好结果2 小时前
MyBatis 精确查询逗号分隔字符串
mysql·mybatis·1024程序员节
苹果醋32 小时前
学习札记-Java8系列-1-Java8新特性简介&为什么要学习Java8
java·运维·spring boot·mysql·nginx
武子康2 小时前
Java-159 MongoDB 副本集容器化 10 分钟速查卡|keyfile + –auth + 幂等 init 附 docker-compose
java·数据库·mongodb·docker·性能优化·nosql·1024程序员节
zz-zjx2 小时前
MySQL 索引深度指南:原理 · 实践 · 运维(适配 MySQL 8.4 LTS)
运维·数据库·mysql
摇滚侠2 小时前
全面掌握PostgreSQL关系型数据库,设置远程连接,笔记05,笔记06
java·数据库·笔记·postgresql
mpHH2 小时前
postgresql plancache --doing
数据库·学习·postgresql·1024程序员节
布朗克1683 小时前
MySQL 运算符详细说明
数据库·mysql·运算符·1024程序员节
机灵猫3 小时前
微服务中的服务熔断、降级与限流
java·数据库·微服务
枫叶丹43 小时前
破局政务数字化核心难题:金仓数据库以国产化方案引领电子证照系统升级之路
数据库·政务·1024程序员节·金仓