:: DEVELOPER ZONE
MySQL peut exploiter certaines optimisation sur les conditions
column IS NULL, comme il peut le faire avec les conditions
column = constant_value. Par exemple, MySQL peut utiliser des
index et des intervalles pour rechercher des valeurs NULL
avecIS NULL.
SELECT * FROM table_name WHERE key_col IS NULL; SELECT * FROM table_name WHERE key_col <=> NULL; SELECT * FROM table_name WHERE key_col=# OR key_col=# OR key_col IS NULL
Si vous utilisez column_name IS NULL sur une colonne NOT NULL
dans une clause WHERE, sur une table qui ne fait pas partie d'une
jointure OUTER JOIN, l'expression sera optimisée immédiatement.
MySQL 4.1.1 peut aussi optimiser des combinaisons column = expr AND column IS NULL, une forme qui est fréquente avec les sous-requêtes.
EXPLAIN vous indiquera ref_or_null lorsque cette optimisation
est utilisée.
Cette optimisation peut gérer une condition IS NULL avec toute
partie de clé.
Quelques exemples de requêtes qui sont optimisées (en supposant qu'il existe
une clé sur t2 (a,b) :
SELECT * FROM t1 WHERE t1.a=expr OR t1.a IS NULL; SELECT * FROM t1,t2 WHERE t1.a=t2.a OR t2.a IS NULL; SELECT * FROM t1,t2 WHERE (t1.a=t2.a OR t2.a IS NULL) AND t2.b=t1.b; SELECT * FROM t1,t2 WHERE t1.a=t2.a AND (t2.b=t1.b OR t2.b IS NULL); SELECT * FROM t1,t2 WHERE (t1.a=t2.a AND t2.a IS NULL AND ...) OR (t1.a=t2.a AND t2.a IS NULL AND ...);
ref_or_null fonctionne en lisant la clé de référence, et après ¸a,
fait une recherche différente pour les valeurs NULL.
Notez que l'optimisation ne peut gérer qu'un seul niveau de conditions
IS NULL.
SELECT * FROM t1,t2 where (t1.a=t2.a AND t2.a IS NULL) OR (t1.b=t2.b AND t2.b IS NULL);
Dans le cas ci-dessus, MySQL va uniquement utiliser une recherche de clé pour la partie
(t1.a=t2.a AND t2.a IS NULL) et ne sera pas capable d'utiliser la clé pour
b.
© 1995-2005 MySQL AB. All rights reserved.
