Eine MERGE
-Tabelle, auch bekannt als
MRG_MyISAM
, ist eine Sammlung identischer
MyISAM
-Tabellen, die als eine einzige Tabelle
verwendet werden können. „Identisch“ bedeutet, dass
alle Tabellen dieselben Spalten- und Indexdaten haben. Sie können
keine MyISAM
-Tabellen zusammenführen
(„mergen“) , in denen die Spalten oder Indizes in
einer unterschiedlichen Reihenfolge stehen, oder die nicht genau
gleich viele Spalten haben. Allerdings können alle
MyISAM
-Tabellen mit
myisampack komprimiert werden. Siehe
Abschnitt 8.4, „myisampack — Erzeugung komprimierter, schreibgeschützter MyISAM Tabellen“. Unterschiede in den
Tabellenoptionen, wie beispielsweise
AVG_ROW_LENGTH
, MAX_ROWS
oder PACK_KEYS
spielen keine Rolle.
Wenn Sie eine MERGE
-Tabelle anlegen, erzeugt
MySQL auf der Festplatte zwei Dateien, deren Namen jeweils mit dem
Tabellennamen beginnen und Erweiterungen haben, die den Dateityp
angeben. Eine .frm
-Datei speichert das
Tabellenformat und eine .MRG
-Datei enthält
die Namen der Tabellen, die wie eine einzige benutzt werden
sollen. Die Tabellen müssen nicht in derselben Datenbank
vorliegen wie die MERGE
-Tabelle selbst.
Mit MERGE
-Tabellen können Sie die Anweisungen
SELECT
, DELETE
,
UPDATE
und INSERT
verwenden.
Sie benötigen SELECT
-,
UPDATE
- und DELETE
-Rechte
für die MyISAM
-Tabellen, die Sie einer
MERGE
-Tabelle zuordnen möchten.
Wenn Sie die MERGE
-Tabelle mit
DROP
löschen, löschen Sie damit nur die
MERGE
-Spezifikation. Die zugrunde liegenden
Tabellen sind davon nicht betroffen.
Um eine MERGE
-Tabelle anzulegen, müssen Sie in
einer
UNION=(
-Klausel angeben, welche list-of-tables
)MyISAM
-Tabellen Sie
als eine einzige benutzen möchten. Optional können Sie mit der
Option INSERT_METHOD
erreichen, dass
Einfügeoperationen in der MERGE
-Tabelle auf
der ersten oder der letzten Tabelle der
UNION
-Liste stattfinden. Wenn Sie den Wert
FIRST
einsetzen, geschieht die Einfügung in
der ersten, wenn Sie LAST
einsetzen, in der
letzten Tabelle. Wenn Sie die
INSERT_METHOD
-Option nicht oder nur mit dem
Wert NO
angeben, zieht jeder Versuch, Zeilen in
die MERGE
-Tabelle einzufügen, eine
Fehlermeldung nach sich.
Das folgende Beispiel zeigt, wie eine
MERGE
-Tabelle angelegt wird:
mysql>CREATE TABLE t1 (
->a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
->message CHAR(20)) ENGINE=MyISAM;
mysql>CREATE TABLE t2 (
->a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
->message CHAR(20)) ENGINE=MyISAM;
mysql>INSERT INTO t1 (message) VALUES ('Testing'),('table'),('t1');
mysql>INSERT INTO t2 (message) VALUES ('Testing'),('table'),('t2');
mysql>CREATE TABLE total (
->a INT NOT NULL AUTO_INCREMENT,
->message CHAR(20), INDEX(a))
->ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;
Der ältere Begriff TYPE
wird aus Gründen der
Abwärtskompatibilität noch als Synonym für
ENGINE
akzeptiert, doch
ENGINE
ist der aktuelle Begriff, während
TYPE
mittlerweile veraltet ist.
Beachten Sie, dass die Spalte a
in den zugrunde
liegenden MyISAM
-Tabellen ein PRIMARY
KEY
ist, aber nicht in der
MERGE
-Tabelle. Dort ist diese Spalte zwar auch
indiziert, aber nicht als PRIMARY KEY
, da eine
MERGE
-Tabelle für die ihr zugrunde liegenden
Tabellen keine Eindeutigkeit erzwingen kann.
Nachdem Sie die MERGE
-Tabelle angelegt haben,
können Sie Anfragen schreiben, die auf der Tabellengruppe als
Ganzes operieren:
mysql> SELECT * FROM total;
+---+---------+
| a | message |
+---+---------+
| 1 | Testing |
| 2 | table |
| 3 | t1 |
| 1 | Testing |
| 2 | table |
| 3 | t2 |
+---+---------+
Beachten Sie, dass sich die .MRG
-Datei direkt
von außerhalb des MySQL-Servers bearbeiten lässt:
shell>cd /
shell>mysql-data-directory
/current-database
ls -1 t1 t2 > total.MRG
shell>mysqladmin flush-tables
Um eine Neuzuordnung einer MERGE
-Tabelle zu
einer anderen Gruppe von MyISAM
-Tabellen zu
erzielen, gibt es folgende Methoden:
Sie löschen die MERGE
-Tabelle mit
DROP
und erstellen sie neu.
Sie ändern die Liste der zugrunde liegenden Tabellen mit
ALTER TABLE
.
tbl_name
UNION=(...)
Sie ändern die .MRG
-Datei und geben eine
FLUSH TABLE
-Anweisung für die
MERGE
-Tabelle und alle zugrunde liegenden
Tabellen aus, damit die Speicher-Engine die neue
Definitionsdatei lesen muss.
MERGE
-Tabellen können bei der Lösung
folgender Probleme behilflich sein:
Einfache Verwaltung einer Menge von Logtabellen. So können
Sie zum Beispiel Daten verschiedener Monate in getrennte
Tabellen laden, einige davon mit myisampack
komprimieren und dann eine MERGE
-Tabelle
anlegen, um das Ganze als ein einziges Log zu verwenden.
Mehr Schnelligkeit. Sie können eine große,
schreibgeschützte Tabelle nach bestimmten Kriterien
aufspalten und die entstehenden Tabellen auf verschiedene
Festplatten speichern. Mit einer
MERGE
-Tabelle aus diesen Einzeltabellen
haben Sie schnelleren Zugriff als mit der großen
Ursprungstabelle.
Effizienteres Suchen. Wenn Sie genau wissen, was Sie wollen,
können Sie für manche Anfragen eine einzelne der
aufgespaltenen Tabellen und für andere die
MERGE
- Tabelle benutzen. Sie können sogar
eine Vielzahl verschiedener MERGE
-Tabellen
bilden, die zum Teil dieselben Einzeltabellen benutzen.
Reparaturen werden effizienter. Es ist einfacher, kleinere
Tabellen zu reparieren, die einer
MERGE
-Tabelle zugeordnet sind, als eine
einzige große Tabelle.
Viele Tabellen können wie eine einzige sofort zugeordnet
werden. Eine MERGE
-Tabelle benötigt keinen
eigenen Index, da sie die Indizes der Einzeltabellen
verwendet. Infolgedessen lassen sich Sammlungen von
MERGE
-Tabellen sehr
schnell erstellen oder neu zuordnen. (Beachten Sie, dass Sie
trotzdem bei der Erstellung einer
MERGE
-Tabelle die Indexdefinitionen angeben
müssen auch wenn keine Indizes angelegt werden.)
Wenn Sie aus mehreren Tabellen nach Bedarf eine einzige,
große Tabelle erstellen müssen, ist es günstiger,
stattdessen eine MERGE
-Tabelle anzulegen.
Diese ist viel schneller und spart eine Menge Speicherplatz.
Mit MERGE
-Tabellen können Sie die
Dateigrößenbeschränkung Ihres Betriebssystems umgehen. Eine
einzelne, große MyISAM
-Tabelle würde
durch dieses Limit begrenzt, aber eine Sammlung von kleineren
MyISAM
-Tabellen nicht.
Sie können einen Alias oder ein Synonym für eine
MyISAM
-Tabelle anlegen, indem Sie eine
MERGE
-Tabelle definieren, der nur diese
eine Tabelle zugeordnet ist. Der Einfluss auf die Leistung
dürfte kaum spürbar sein (nur ein paar indirekte Aufrufe und
memcpy()
-Aufrufe für jede Leseoperation).
Die Nachteile von MERGE
-Tabellen sind:
Es dürfen nur identische MyISAM
-Tabellen
für eine MERGE
-Tabelle benutzt werden.
Eine Reihe von MyISAM
-Features steht für
MERGE
-Tabellen nicht zur Verfügung. Sie
können zum Beispiel keine FULLTEXT
-Indizes
auf ihnen anlegen. (Es bleibt Ihnen natürlich unbenommen,
FULLTEXT
-Indizes auf den zugrunde liegenden
MyISAM
-Tabellen anzulegen, doch aber auf
der MERGE
-Tabelle können Sie keine
Volltextsuche ausführen.)
Wenn die MERGE
-Tabelle nicht-temporär ist,
müssen auch die zugrunde liegenden
MyISAM
-Tabellen nicht-temporär sein. Ist
die MERGE
-Tabelle hingegen temporär,
können die MyISAM
-Tabellen eine beliebige
Mixtur aus temporären und nicht-temporären Tabellen sein.
MERGE
-Tabellen verwenden mehr
Dateideskriptoren. Wenn 10 Clients eine
MERGE
-Tabelle ansprechen, die ihrerseits 10
Tabellen abbildet, benutzt der Server (10 × 10) + 10
Dateideskriptoren. (10 Datendateideskriptoren für jeden der
10 Clients und 10 Indexdateideskriptoren, die von den Clients
gemeinsam genutzt werden.)
Lesevorgänge von Schlüsseln sind langsamer. Wenn Sie einen
Schlüssel lesen, muss die
MERGE
-Speicher-Engine eine Leseoperation
auf allen zugrunde liegenden Tabellen ausführen, um
festzustellen, welche dem gegebenen Schlüssel am besten
entspricht. Um den nächsten Schlüssel zu lesen, muss die
MERGE
-Speicher-Engine die Lesepuffer nach
ihm durchsuchen. Erst wenn ein Schlüsselpuffer aufgebraucht
ist, muss die Speicher-Engine den nächsten Schlüsselblock
lesen. Das macht MERGE
-Schlüssel in
eq_ref
-Suchen viel langsamer, aber nicht in
ref
-Suchen. Unter Abschnitt 7.2.1, „EXPLAIN
-Syntax (Informationen über ein
SELECT
erhalten)“
finden Sie weitere Informationen über
eq_ref
und ref
.
Ein spezielles Forum zur Speicher-Engine
MERGE
finden Sie unter
http://forums.mysql.com/list.php?93.
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.