原查询大致为:
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表数据集的数据量,从而提升速度。