У меня есть таблица 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 |
+----+--------------------+--------+------+---------------+------+---------+------+------+----------+-------------+
Но почему? Подзапрос является полностью независимым и более-менее предназначен для возврата списка идентификаторов.
(Если быть точным: каждый file_id
может появляться несколько раз в reades
, конечно, поскольку для каждого файла может быть произвольно много операций чтения.)