J'effectue une requête qui recherche des valeurs dans une table qui ne sont pas dans une autre. Par exemple:Optimisation de requête MySQL
SELECT id FROM table1 WHERE id NOT IN (SELECT id FROM table2);
Les deux tableaux ont environ 1 million de lignes, mais seulement quelques centaines qui ne correspondent pas à des valeurs qui sont retournées dans le jeu de résultats. La requête prend environ 35 secondes. Faire un profil d'exposition sur la requête montre que mysql passe la plupart du temps dans l'état de "préparation". Des idées sur comment je peux optimiser cet état ou ce qui se passe réellement pendant la "préparation"?
La valeur d'identifiant dans les deux tables est indexée et de même type et taille.
Le profil complet de la requête est:
+--------------------------------+----------+
| Status | Duration |
+--------------------------------+----------+
| (initialization) | 0 |
| checking query cache for query | 0 |
| Opening tables | 0.13 |
| System lock | 0 |
| Table lock | 0 |
| init | 0.01 |
| optimizing | 0 |
| statistics | 0 |
| preparing | 0 |
| executing | 0 |
| Sending data | 0 |
| optimizing | 0 |
| statistics | 0 |
| preparing | 34.83 |
| end | 0 |
| query end | 0 |
| freeing items | 0 |
| closing tables | 0 |
| logging slow query | 0 |
+--------------------------------+----------+
Des conseils sont appréciés.
Merci.
heureux que vous chnaged qui se joignent droit à une gauche! –
Devrait-il être là et où b.id est nul? –
il est préférable de spécifier cela dans la clause where; mais l'optimiseur devrait produire des plans identiques. –