为什么这个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中。
谢谢。
答案 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
还有第二件事:
“因为文件也可以在另一个文件夹中”
使用子查询意味着什么?