0

为什么这个 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 中。

谢谢你。

4

3 回答 3

2

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

它需要为N文件完成。

所以你的查询的复杂性是O(N^2). 17k ^ 2 = ~4*10^8所以大约需要一分钟,也许更短。

为什么您的查询不是

SELECT ID FROM files_folders WHERE Folder = 123

?

于 2012-04-03T19:45:10.973 回答
1

使用自联接:

SELECT 
  ff.* 
FROM 
  files_folders AS ff
  INNER jOIN files_folders AS f ON f.ID=ff.ID
WHERE
  f.Folder=123
;
于 2012-04-03T20:02:38.753 回答
-1

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

SELECT * FROM files_folders WHERE Folder = 123

第二件事:

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

使用子查询是什么意思?

于 2012-04-04T06:14:35.740 回答