MySQL kann dieselbe Optimierung an
col_name IS NULL
vornehmen, die es auch für col_name
= constant_value
durchführen kann. So kann MySQL etwa Indizes und Bereiche zur
Suche nach NULL mit IS
NULL verwenden.
Ein paar Beispiele:
SELECT * FROMtbl_nameWHEREkey_colIS NULL; SELECT * FROMtbl_nameWHEREkey_col<=> NULL; SELECT * FROMtbl_nameWHEREkey_col=const1ORkey_col=const2ORkey_colIS NULL;
Wenn eine WHERE-Klausel eine Bedingung
col_name IS NULL
für eine Spalte enthält, die als NOT NULL
deklariert ist, dann wird dieser Ausdruck wegoptimiert. Diese
Optimierung findet allerdings nicht in Fällen statt, in denen
die Spalte ohnehin NULL erzeugen könnte –
z. B. wenn sie aus einer Tabelle auf der rechten Seite eines
LEFT JOIN stammt.
MySQL kann auch die Kombination
optimieren; diese Form tritt bei aufgelösten Unterabfragen
häufig auf. col_name =
expr AND
col_name IS NULLEXPLAIN zeigt
ref_or_null an, wenn diese Optimierung
verwendet wird.
Diese Optimierung kann je Schlüsselteil eine IS
NULL-Bedingung verarbeiten.
Es folgen einige Beispiele für optimierte Abfragen (hierbei
wird davon ausgegangen, dass ein Index für die Spalten
a und b der Tabelle
t2 vorhanden ist):
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 ...);
Bei ref_or_null wird zunächst der
Referenzschlüssel ausgelesen. Danach erfolgt eine separate
Suche nach Datensätzen mit einem
NULL-Schlüsselwert.
Beachten Sie, dass die Optimierung nur eine IS
NULL-Ebene verarbeiten kann. In der folgenden Abfrage
verwendet MySQL Schlüsselsuchvorgänge nur für den Ausdruck
(t1.a=t2.a AND t2.a IS NULL). Der
Schlüsselteil zu b kann von MySQL nicht
verwendet werden:
SELECT * FROM t1, t2
WHERE (t1.a=t2.a AND t2.a IS NULL)
OR (t1.b=t2.b AND t2.b IS NULL);
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.
