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

相关推荐
独行soc14 分钟前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘
fantasy_arch20 分钟前
CPU性能优化-磁盘空间和解析时间
网络·性能优化
White_Mountain32 分钟前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu
Code apprenticeship33 分钟前
怎么利用Redis实现延时队列?
数据库·redis·缓存
百度智能云技术站36 分钟前
广告投放系统成本降低 70%+,基于 Redis 容量型数据库 PegaDB 的方案设计和业务实践
数据库·redis·oracle
老王笔记37 分钟前
GTID下复制问题和解决
mysql
装不满的克莱因瓶38 分钟前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb
清平乐的技术专栏1 小时前
Hive SQL 查询所有函数
hive·hadoop·sql
Lojarro2 小时前
【Spring】Spring框架之-AOP
java·mysql·spring
梦想平凡2 小时前
PHP 微信棋牌开发全解析:高级教程
android·数据库·oracle