5

我有 3 个 SQL 查询:

  1. 从 user_id =4 的用户中选择 student_id;// 返回 35
  2. select * from student where student_id in (35);
  3. select * from student where student_id in (select student_id from user where user_id =4);

前 2 个查询耗时不到 0.5 秒,但第三个查询(类似于第 2 个包含第一个作为子查询的查询)大约需要 8 秒。

我根据需要对表进行了索引,但时间并没有减少。

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

谢谢!

4

2 回答 2

5

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

例如,它 select * from student (取决于您的数据库,但可能返回许多结果),然后将内部查询 user_id=4 应用于先前的结果。

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

编辑:

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

于 2013-06-26T12:02:56.973 回答
1

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

select
  s.*
from
  student s 
inner join 
  user u 
on s.id_student_id = u.student_id
where
  u.user_id = 4
;
于 2013-06-26T12:06:07.940 回答