记一次sql 查询很慢, DEPENDENT SUBQUERY。

发布时间 2023-06-20 14:46:06作者: 远方的人

sql 如下。 需求很简单: 其中r 是一张关联 c 和用户的表。 查询出某个用户没有关注过的c数据。

select c.*
        from c
        where
            //其他普通c表列条件省略
NOT EXISTS (SELECT 1 FROM  r WHERE r.n= 10119 AND r.is_valid=1 AND r.id= c.id)
                 
 

查询很慢,猜测是not exists引起。改成另一写法: 

select c.*
        from c
left join (SELECT 1 FROM  r WHERE r.n= 10119 AND r.is_valid=1 ) ron  r.id= c.id
        where
            //其他普通c表列条件省略
r.id is null 

明显变快。 

explain 结果如下。

 sql1  用到  DEPENDENT SUBQUERY 嵌套子查询。 这会根据主表的结果数对 字表进行相应结果次数的查询。 而left join 只查询一次子表。

知识点: 如果把sql1 中的  = c.id  换成一个固定字符串。则explaion 会变成:SUBQUERY. 

1. DEPENDENT SUBQUERY在SELECT或WHERE列表中包含了子查询,子查询基于外层

2. ​SUBQUERY在SELECT或WHERE列表中包含了子查询

 结论: 如果子查询需要依赖外出结果,慎用。 改用join 实现。