[+/-]
Die Indexverschmelzungsmethode wird
verwendet, um Datensätze mit mehreren
range
-Scans abzurufen und deren Ergebnisse zu
einem Ergebnis zu verschmelzen. Die Verschmelzung kann Unions,
Schnittmengen oder Schnittmengen-Unions der zugrunde liegenden
Scans erzeugen.
In der Ausgabe von EXPLAIN
erscheint die
Indexverschmelzungsmethode als index_merge
in
der type
-Spalte. In diesem Fall enthält die
Spalte key
eine Liste der verwendeten
Indizes, und key_len
enthält eine Liste der
längsten Schlüsselteile für diese Indizes.
Ein paar Beispiele:
SELECT * FROMtbl_name
WHEREkey_part1
= 10 ORkey_part2
= 20; SELECT * FROMtbl_name
WHERE (key_part1
= 10 ORkey_part2
= 20) ANDnon_key_part
=30; SELECT * FROM t1, t2 WHERE (t1.key1
IN (1,2) OR t1.key2
LIKE 'value
%') AND t2.key1
=t1.some_col
; SELECT * FROM t1, t2 WHERE t1.key1
=1 AND (t2.key1
=t1.some_col
OR t2.key2
=t1.some_col2
);
Die Indexverschmelzungsmethode umfasst mehrere
Zugriffsalgorithmen (diese können dem Feld
Extra
in der Ausgabe von
EXPLAIN
entnommen werden):
Using intersect(…)
Using union(…)
Using sort_union(…)
Die folgenden Abschnitte beschreiben diese Methoden im Detail.
Hinweis: Der Optimierungsalgorithmus für die Indexverschmelzung weist die folgenden bekannten Defizite auf:
Wenn ein Bereichsscan für einen Schlüssel möglich ist, wird eine Indexverschmelzung nicht in Betracht gezogen. Betrachten Sie etwa folgende Abfrage:
SELECT * FROM t1 WHERE (goodkey1 < 10 OR goodkey2 < 20) AND badkey < 30;
Hierbei sind zwei Pläne möglich:
ein Indexverschmelzungsscan unter Verwendung der
Bedingung (goodkey1 < 10 OR goodkey2 <
20)
ein Bereichsscan unter Verwendung der Bedingung
badkey < 30
Der Optimierer allerdings zieht nur den zweiten Plan in
Betracht. Wenn Sie dies nicht wollen, können Sie mit
IGNORE INDEX
oder FORCE
INDEX
dafür sorgen, dass der Optimierer auch die
Indexverschmelzung berücksichtigt. Die folgenden beiden
Abfragen werden unter Verwendung der Indexverschmelzung
ausgeführt:
SELECT * FROM t1 FORCE INDEX(goodkey1,goodkey2) WHERE (goodkey1 < 10 OR goodkey2 < 20) AND badkey < 30; SELECT * FROM t1 IGNORE INDEX(badkey) WHERE (goodkey1 < 10 OR goodkey2 < 20) AND badkey < 30;
Wenn Ihre Abfrage eine komplexe
WHERE
-Klausel mit tiefer
AND
- oder
OR
-Verschachtelung enthält und MySQL
nicht den optimalen Plan auswählt, versuchen Sie die Terme
mithilfe der folgenden Identitätsgesetze zu verteilen:
(x
ANDy
) ORz
= (x
ORz
) AND (y
ORz
) (x
ORy
) ANDz
= (x
ANDz
) OR (y
ANDz
)
Die Indexverschmelzung ist nicht für Volltextindizes einsetzbar. Wir beabsichtigen, dies in einem zukünftigen MySQL-Release zu ändern.
Die Auswahl zwischen verschiedenen möglichen Varianten der Indexverschmelzungsmethode und anderen Zugriffsmethoden basiert auf Kostenschätzungen der verschiedenen verfügbaren Optionen.
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.