记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表数据集的数据量,从而提升速度。

相关推荐
咸鱼翻身小阿橙1 分钟前
文件读写 + Qt Model/View + 自定义分页+搜索过滤
java·数据库·qt
在繁华处4 分钟前
Java从零到熟练(十):JVM基础与性能优化
java·jvm·性能优化
l1t4 分钟前
DeepSeek总结的DuckDB-Iceberg 在 v1.5.3 中的新特性
数据库·duckdb
Database_Cool_5 分钟前
数据仓库弹性扩缩容怎么实现?阿里云 AnalyticDB MySQL Serverless 弹性架构详解
数据库·人工智能·阿里云
abcy0712137 分钟前
django聚合函数
数据库·sqlite
念越7 分钟前
数据库系统概论第6版王珊版:第二章关系代数与第三章SQL期末重点整理
数据库·sql·性能优化
TDengine (老段)11 分钟前
TDengine 数据保留与 TTL — 多级存储、过期删除与分层迁移
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
安当加密030114 分钟前
等保2.0三级数据库加密:2026检查清单 + TDE部署实战(附脚本)
数据库·网络安全·数据安全·tde·等保2.0·数据库加密·tde透明加密
解决问题no解决代码问题18 分钟前
TiDB 原理与节点宕机实战讲解
数据库·tidb
禅思院20 分钟前
大列表性能优化 · 面试精讲 · 一
面试·职场和发展·性能优化