为什么这个简单的查询需要永远?

时间:2012-04-03 19:37:31

标签: mysql subquery where-in

为什么这个MySQL查询会在具有17k行的表上永远(并且永远不会完成)?

SELECT * FROM files_folders WHERE file IN (SELECT file FROM files_folders WHERE folder = 123);

基本上,文件可以位于多个文件夹中(物理文件及其副本)。我正在尝试获取文件夹123中的所有文件。现在在我的示例中,文件夹123中有2个文件.ID#4222& ID#7121。但是这两个文件可能在其他文件夹以及文件夹123中。

我这样做的方式是错误的还是我缺少的东西?

编辑:以下是表格结构的示例。

+--------------+
| file | folder|
+------+-------+
| 1    | 1     |
| 2    | 1     |
| 1    | 2     |
| 3    | 2     |
| 4    | 3     |
+------+-------+

所以我想选择文件夹1中将返回的所有文件(及其副本):

+--------------+
| file | folder|
+------+-------+
| 1    | 1     |
| 2    | 1     |
| 1    | 2     |
+------+-------+

因为文件1都在文件夹1和2中。

谢谢。

3 个答案:

答案 0 :(得分:2)

对于每个文件,MySQL需要检查子查询返回的结果中是否ID。它需要O(N)

需要为N个文件完成。

您的查询的复杂性为O(N^2)。 17k ^ 2 =〜4*10^8所以它应该花费大约一分钟,也许更少。

为什么您的查询不是

SELECT ID FROM files_folders WHERE Folder = 123

答案 1 :(得分:1)

使用自我加入:

SELECT 
  ff.* 
FROM 
  files_folders AS ff
  INNER jOIN files_folders AS f ON f.ID=ff.ID
WHERE
  f.Folder=123
;

答案 2 :(得分:-1)

为什么使用子查询?我认为根本不需要它。您可以直接从表中选择

SELECT * FROM files_folders WHERE Folder = 123

还有第二件事:

  

“因为文件也可以在另一个文件夹中”

使用子查询意味着什么?