记一次sql 查询很慢, DEPENDENT SUBQUERY。
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 实现。