我有一個表files
與文件和表reades
讀取這些文件的訪問。在表reades
中有一列file_id
,其中涉及files
中的相應列。現在應該是獨立的子查詢不是。爲什麼?
我想列出還沒有被存取,並嘗試這樣所有文件:
SELECT * FROM files WHERE file_id NOT IN (SELECT file_id FROM reades)
這是非常緩慢的。原因是mySQL認爲子查詢依賴於查詢:
+----+--------------------+--------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+--------------------+--------+------+---------------+------+---------+------+------+----------+-------------+
| 1 | PRIMARY | files | ALL | NULL | NULL | NULL | NULL | 1053 | 100.00 | Using where |
| 2 | DEPENDENT SUBQUERY | reades | ALL | NULL | NULL | NULL | NULL | 3242 | 100.00 | Using where |
+----+--------------------+--------+------+---------------+------+---------+------+------+----------+-------------+
但是爲什麼?子查詢是完全獨立的,或多或少只是爲了返回一個ID列表。
(準確地說:每個file_id
可以reades
出現多次,當然,因爲可以有用於每個文件任意多個讀取操作。)
這是MySQL中的一個[bug](http://bugs.mysql.com/bug.php?id=63701)。它是從MySQL 5.6.3開始修復的。 – rustyx 2015-01-23 10:48:05