J'ai une table files
avec des fichiers et une table reades
avec accès en lecture à ces fichiers. Dans la table reades
il y a une colonne file_id
où se réfère à la colonne respective dans files
.Une sous-requête qui devrait être indépendante ne l'est pas. Pourquoi?
Maintenant, je voudrais lister tous les fichiers qui ne sont pas accessibles et essayé ceci:
SELECT * FROM files WHERE file_id NOT IN (SELECT file_id FROM reades)
Ceci est terriblement lent. La raison en est que mySQL pense que la sous-requête dépend de la requête:
+----+--------------------+--------+------+---------------+------+---------+------+------+----------+-------------+
| 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 |
+----+--------------------+--------+------+---------------+------+---------+------+------+----------+-------------+
Mais pourquoi? La sous-requête est complètement indépendante et plus ou moins destinée à renvoyer une liste d'identifiants.
(Pour être précis: Chaque file_id
peut apparaître plusieurs fois dans reades
, bien sûr, comme il peut y avoir un nombre arbitraire d'opérations de lecture pour chaque fichier.)
Ceci est un [bug] (http://bugs.mysql.com/bug.php?id=63701) dans MySQL. Il est corrigé à partir de MySQL 5.6.3. – rustyx