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。ただし、これら2つのファイルは、フォルダー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

各ファイルについて、MySQLIDはサブクエリによって返される結果にが含まれているかどうかを確認する必要があります。かかりますO(N)

ファイルに対して行う必要がありNます。

したがって、クエリの複雑さはですO(N^2)。17k ^ 2 =〜4*10^8なので、1分ほどかかるはずですが、それより短いかもしれません。

クエリがそうでない理由

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

そして2番目のこと:

「ファイルは別のフォルダにもある可能性があるため」

サブクエリを使用するとはどういう意味ですか?

于 2012-04-04T06:14:35.740 に答える