SQL:in子句,与带有实际数据的in子句相比,查询占用时间过长

时间:2013-06-26 11:15:10

标签: mysql subquery in-subquery

我有3个SQL查询:

  1. 从user_id = 4的用户中选择student_id; //返回35
  2. 从学生中选择*,其中student_id在(35);
  3. 从student_id中选择*(从user_id = 4的用户中选择student_id);
  4. 前两个查询的时间不到0.5秒,但是第三个查询类似于第二个包含1st作为子查询,大约需要8秒。

    我根据自己的需要为表编制索引,但时间并没有减少。

    有人可以给我一个解决方案或对此行为提供一些解释。

    谢谢!

2 个答案:

答案 0 :(得分:5)

实际上,MySQL在最后执行内部查询,它会扫描每个索引。 MySQL重写子查询,以使内部查询完全依赖于外部查询。

例如,它从学生中选择*(取决于您的数据库,但可以返回许多结果),然后将内部查询user_id = 4应用于上一个结果。

开发团队正在解决这个问题,它应该在6.0 http://dev.mysql.com/doc/refman/5.5/en/optimizing-subqueries.html

中“解决”

修改

在您的情况下,您应该使用JOIN方法。

答案 1 :(得分:1)

不是使用子查询,但为什么不在这里使用连接?

select
  s.*
from
  student s 
inner join 
  user u 
on s.id_student_id = u.student_id
where
  u.user_id = 4
;