Die Bereichsbedingungen für einen mehrteiligen Index stellen eine Erweiterung der Bereichsbedingungen für einen einteiligen Index dar. Eine Bereichsbedingung für einen mehrteiligen Index beschränkt die Indexdatensätze auf solche, die innerhalb eines oder mehrerer Schlüsseltupelintervalle liegen. Schlüsseltupelintervalle werden über eine Menge von Schlüsseltupeln definiert, wobei die Sortierung dem Index entnommen wird.
Betrachten Sie beispielsweise einen mehrteiligen Index, der
als key1(
definiert ist,
und die folgende Menge der in der Schlüsselreihenfolge
aufgelisteten Schlüsseltupel:
key_part1
,
key_part2
,
key_part3
)
key_part1
key_part2
key_part3
NULL 1 'abc' NULL 1 'xyz' NULL 2 'foo' 1 1 'abc' 1 1 'xyz' 1 2 'abc' 2 1 'aaa'
Die Bedingung
definiert das folgende Intervall:
key_part1
=
1
(1,-inf,-inf) <= (key_part1
,key_part2
,key_part3
) < (1,+inf,+inf)
Das Intervall deckt das vierte, das fünfte und das sechste Tupel in der obigen Datenmenge ab und kann von der Bereichszugriffsmethode verwendet werden.
Im Gegensatz dazu definiert die Bedingung
kein einzelnes Intervall und kann von der
Bereichszugriffsmethode nicht verwendet werden.
key_part3
=
'abc'
Die folgenden Beschreibungen erläutern im Detail, wie Bereichsbedingungen bei mehrteiligen Indizes funktionieren.
Bei HASH
-Indizes kann jedes Intervall
verwendet werden, das identische Werte enthält. Das
bedeutet, dass das Intervall nur für Bedingungen in der
folgenden Form erzeugt werden kann:
key_part1
cmp
const1
ANDkey_part2
cmp
const2
AND ... ANDkey_partN
cmp
constN
;
Hierbei sind const1
,
const2
, … Konstanten,
cmp
ist einer der
Vergleichsoperatoren =
,
<=>
oder IS
NULL
, und die Bedingungen decken alle
Indexbestandteile ab. (Das bedeutet, es gibt
N
Bedingungen: eine für jeden
Teil eines N
-teiligen Indexes.)
Nachfolgend gezeigt ist etwa eine Bereichsbedingung für
einen dreiteiligen HASH
-Index:
key_part1
= 1 ANDkey_part2
IS NULL ANDkey_part3
= 'foo'
Eine Definition dessen, was als Konstanten betrachtet wird, finden Sie in Abschnitt 7.2.5.1, „Die Bereichszugriffsmethode (Range Access) für Indizes, die aus einzelnen Komponenten bestehen“.
Bei einem BTREE
-Index kann ein
Intervall für Bedingungen verwendbar sein, die mit
AND
kombiniert wurden, wobei jede
Bedingung einen Schlüsselteil mit einem Konstantenwert
unter Verwendung von =
,
<=>
, IS NULL
,
>
, <
,
>=
, <=
,
!=
, <>
,
BETWEEN
oder LIKE
'
vergleicht
(wobei
pattern
''
nicht mit einem Jokerzeichen beginnen darf). Ein Intervall
kann verwendet werden, solange es möglich ist, ein
einzelnes Schlüsseltupel zu bestimmen, das alle
Datensätze enthält, die der Bedingung entsprechen (bzw.
zwei Intervalle, wenn pattern
'<>
oder
!=
verwendet werden). Betrachten Sie
etwa folgende Bedingung:
key_part1
= 'foo' ANDkey_part2
>= 10 ANDkey_part3
> 10
Das einzelne Intervall ist:
('foo',10,10) < (key_part1
,key_part2
,key_part3
) < ('foo',+inf,+inf)
Es ist möglich, dass das erstellte Intervall mehr
Datensätze enthält als die Ursprungsbedingung. So
umfasst das obige Intervall beispielsweise den Wert
('foo', 11, 0)
, der die ursprüngliche
Bedingung nicht erfüllt.
Wenn Bedingungen, die Mengen von Datensätzen innerhalb
von Intervallen abdecken, mit OR
kombiniert werden, bilden sie eine Bedingung, die eine
Menge von Datensätzen abdeckt, die in der Union dieser
Intervalle enthalten sind. Werden die Bedingungen mit
AND
kombiniert, dann bilden sie eine
Bedingung, die die Menge von Datensätzen in der
Schnittmenge der Intervalle abdeckt. Betrachten Sie etwa
die folgende Bedingung für einen zweiteiligen Index:
(key_part1
= 1 ANDkey_part2
< 2) OR (key_part1
> 5)
Die Intervalle sehen hier wie folgt aus:
(1,-inf) < (key_part1
,key_part2
) < (1,2) (5,-inf) < (key_part1
,key_part2
)
In diesem Beispiel verwendet das Intervall für die erste
Zeile einen Schlüsselteil für die linke Grenze und zwei
Schlüsselteile für die rechte Grenze. Das Intervall in
der zweiten Zeile benutzt dagegen nur einen
Schlüsselteil. Die Spalte key_len
in
der Ausgabe von EXPLAIN
gibt die
maximale Länge des verwendeten Schlüsselpräfixes an.
In manchen Fällen kann key_len
anzeigen, dass ein Schlüsselteil verwendet wurde, aber
dies entspricht unter Umständen nicht dem, was Sie
erwarten. Angenommen, key_part1
und key_part2
können
NULL
sein. In diesem Fall zeigt die
Spalte key_len
zwei
Schlüsselteillängen für die folgende Bedingung an:
key_part1
>= 1 ANDkey_part2
< 2
Tatsächlich aber wird die Bedingung wie folgt konvertiert:
key_part1
>= 1 ANDkey_part2
IS NOT NULL
Abschnitt 7.2.5.1, „Die Bereichszugriffsmethode (Range Access) für Indizes, die aus einzelnen Komponenten bestehen“, beschreibt, wie Optimierungen zur Kombination oder Beseitigung von Intervallen für Bereichsbedingungen für einen einteiligen Index durchgeführt werden. Für Bereichsbedingungen für mehrteilige Indizes werden die Schritte analog durchgeführt.
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.