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_name
WHEREkey_col
IS NULL; SELECT * FROMtbl_name
WHEREkey_col
<=> NULL; SELECT * FROMtbl_name
WHEREkey_col
=const1
ORkey_col
=const2
ORkey_col
IS 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.