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
.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.