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

相关推荐
zjy277772 小时前
Golang bcrypt如何加密密码_Golang密码加密教程【收藏】
jvm·数据库·python
万邦科技Lafite3 小时前
API接口一键获取商品评论,根据商品评论分析客户画像
linux·服务器·数据库·windows·microsoft·电商开放平台
phltxy3 小时前
Redis 核心数据类型之 String 详解
数据库·redis·bootstrap
老纪3 小时前
Redis怎样利用Lua为多个Key同步续期
jvm·数据库·python
2403_883261093 小时前
C#怎么计算两个日期的差值_C#如何处理时间跨度【笔记】
jvm·数据库·python
m0_740653223 小时前
Golang切片底层原理是怎样的_Golang切片实现原理教程【简明】
jvm·数据库·python
yexuhgu3 小时前
CSS如何处理CSS逻辑属性兼容性_通过PostCSS转译为物理属性
jvm·数据库·python
m0_624578593 小时前
CSS如何给Bootstrap背景添加半透明层_使用rgba颜色模式与定位
jvm·数据库·python
m0_470857643 小时前
CSS如何实现等宽表格布局_利用table-layout与盒模型
jvm·数据库·python
kexnjdcncnxjs3 小时前
HTML 中使用 EXIF.js 读取图片元数据失败的常见原因与解决方案
jvm·数据库·python