Die Speicher-Engine MEMORY
legt Tabellen mit
Inhalten an, die im Arbeitsspeicher gespeichert sind. Früher
wurden sie als HEAP
-Tabellen bezeichnet. Heute
ist MEMORY
der bevorzugte Ausdruck, auch wenn
HEAP
aus Gründen der Abwärtskompatibilität
weiter unterstützt wird.
Zu jeder MEMORY
-Tabelle gehört eine
Festplattendatei. Der Dateiname beginnt mit dem Tabellennamen und
hat die Erweiterung .frm
, um anzuzeigen, dass
hier die Tabellendefinition (frm = form) gespeichert ist.
Um explizit eine MEMORY
-Tabelle anzulegen,
geben Sie dies in der Tabellenoption ENGINE
an:
CREATE TABLE t (i INT) ENGINE = MEMORY;
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.
Wie der Name schon sagt, werden MEMORY
-Tabellen
im Arbeitsspeicher gespeichert und sie benutzen nach
Voreinstellung einen gehashten Index. Das macht sie sehr schnell
und nützlich für temporäre Tabellen. Wenn allerdings der Server
abstürzt, gehen alle in MEMORY
-Tabellen
gespeicherten Daten verloren. Die Tabellen selbst bestehen weiter,
da ihre Definitionen in .frm
-Dateien auf der
Festplatte gespeichert sind, doch ihre Daten sind fort, wenn der
Server wieder hochfährt.
Das folgende Beispiel zeigt, wie eine
MEMORY
-Tabelle erzeugt, benutzt und gelöscht
wird:
mysql>CREATE TABLE test ENGINE=MEMORY
->SELECT ip,SUM(downloads) AS down
->FROM log_table GROUP BY ip;
mysql>SELECT COUNT(ip),AVG(down) FROM test;
mysql>DROP TABLE test;
Kennzeichen von MEMORY
-Tabellen:
Speicherplatz für MEMORY
-Tabellen wird in
kleinen Blöcken zugewiesen. Die Tabellen verwenden 100%
dynamisches Hashing für Einfügeoperationen. Es werden keine
Overflow- Bereiche und kein zusätzlicher Platz für
Schlüssel oder für Freelists benötigt. Gelöschte Zeilen
werden in eine verkettete Liste geschrieben und
wiederverwendet, wenn neue Daten in die Tabelle eingefügt
werden. MEMORY
-Tabellen haben auch keine
Probleme mit Löschen plus Einfügen, was normalerweise bei
gehashten Tabellen häufig vorkommt.
MEMORY
-Tabellen können bis zu 32 Indizes
mit jeweils bis zu 16 Spalten und einer maximalen
Schlüssellänge von 500 Bytes haben.
Die Speicher-Engine MEMORY
implementiert
sowohl HASH
- als auch
BTREE
-Indizes. Mit einer
USING
-Klausel können Sie angeben, welchen
von beiden Sie wünschen:
CREATE TABLE lookup (id INT, INDEX USING HASH (id)) ENGINE = MEMORY; CREATE TABLE lookup (id INT, INDEX USING BTREE (id)) ENGINE = MEMORY;
Die allgemeinen Merkmale von B-Baum- und Hash-Indizes werden in Abschnitt 7.4.5, „Wie MySQL Indizes benutzt“ beschrieben.
In MEMORY
-Tabellen können nicht-eindeutige
Schlüssel verwendet werden. (Dies ist ungewöhnlich für
Implementierungen von Hash-Indizes.)
Wenn Sie einen Hash-Index auf einer
MEMORY
-Tabelle mit sehr vielen doppelten
Schlüsseln haben (viele Indexeinträge enthalten denselben
Wert), dann laufen Updates, die Schlüsselwerte betreffen,
sowie sämtliche Löschoperationen deutlich langsamer. Wie
viel langsamer, hängt von dem Ausmaß der
Schlüsselduplikation ab (umgekehrt proportional zur
Indexkardinalität). Um dieses Problem zu vermeiden, verwenden
Sie einen BTREE
-Index.
Indizierte Spalten können NULL
-Werte
enthalten.
MEMORY
-Tabellen verwenden ein
Speicherformat mit fester Zeilenlänge.
MEMORY
-Tabellen dürfen keine
BLOB
- oder TEXT
-Spalten
enthalten.
MEMORY
unterstützt
AUTO_INCREMENT
-Spalten.
INSERT DELAYED
kann mit
MEMORY
-Tabellen verwendet werden. Siehe
Abschnitt 13.2.4.2, „INSERT DELAYED
“.
MEMORY
-Tabellen werden von allen Clients
gemeinsam genutzt (wie jede andere
nicht-TEMPORARY
-Tabelle).
MEMORY
-Tabellen speichern ihren Inhalt im
Arbeitsspeicher, eine Eigenschaft, die sie mit internen
Tabellen gemeinsam haben, die der Server bei der Verarbeitung
von Anfragen nebenbei anlegt. Die beiden Tabellentypen
unterscheiden sich jedoch darin, dass
MEMORY
-Tabellen im Gegensatz zu den
internen Tabellen nicht von Speicherkonvertierung betroffen
sind:
Wenn eine interne Tabelle zu groß wird, konvertiert der
Server sie automatisch in eine Festplattentabelle. Deren
maximale Größe wird durch die Systemvariable
tmp_table_size
festgelegt.
MEMORY
-Tabellen werden nie in
Festplattentabellen konvertiert. Um sicherzustellen, dass
Sie nicht versehentlich den gesamten Arbeitsspeicher
benutzen, können Sie die Systemvariable
max_heap_table_size
so einstellen, dass
auch MEMORY
-Tabellen einem
Größenlimit unterliegen. Für einzelne Tabellen können
Sie auch in der CREATE TABLE
-Anweisung
die Tabellenoption MAX_ROWS
-Tabelle
setzen.
Der Server benötigt genug Arbeitsspeicher, um alle
MEMORY
-Tabellen zu pflegen, die zur selben
Zeit gebraucht werden.
Um den von einer MEMORY
-Tabelle belegten
Speicher wieder freizugeben, wenn sie nicht länger benötigt
wird, führen Sie DELETE
oder
TRUNCATE TABLE
aus oder löschen die
Tabelle mit DROP TABLE
.
Möchten Sie beim Starten des MySQL-Servers Daten in eine
MEMORY
-Tabelle laden, so können Sie die
Option --init-file
nutzen. In diese Datei
können Sie Anweisungen wie INSERT INTO ...
SELECT
oder LOAD DATA INFILE
setzen, um die Tabelle aus einer persistenten Datenquelle zu
laden. Siehe Abschnitt 5.2.1, „Befehlsoptionen für mysqld“, and
Abschnitt 13.2.5, „LOAD DATA INFILE
“.
Wenn Sie Replikation benutzen, werden die
MEMORY
-Tabellen auf dem Masterserver auf
Platte geschrieben, wenn dieser heruntergefahren und neu
gestartet wird. Ein Slave merkt allerdings nicht, dass die
Tabellen inzwischen leer sind, und gibt ihren alten Inhalt
zurück, wenn Sie Daten von ihm abfragen. Wird eine
MEMORY
-Tabelle auf einem Master nach einem
Neustart erstmals wieder genutzt, so wird automatisch eine
DELETE
-Anweisung in sein Binärlog
geschrieben, um den Slave wieder mit ihm zu synchronisieren.
Doch Vorsicht: Auch bei dieser Strategie hat der Slave in dem
Zeitraum zwischen dem Neustart des Masters und seinem ersten
Zugriff auf die Tabelle veraltete Daten im Speicher. Wenn Sie
jedoch die MEMORY
-Tabelle gleich beim
Hochfahren des Masters mithilfe der Option
--init-file
wieder mit Inhalt füllen, ist
gewährleistet, dass dieser Zeitraum auf Null schrumpft.
Der für eine Zeile in einer MEMORY
-Tabelle
benötigte Speicher lässt sich mit folgendem Ausdruck
berechnen:
SUM_OVER_ALL_BTREE_KEYS(max_length_of_key
+ sizeof(char*) × 4) + SUM_OVER_ALL_HASH_KEYS(sizeof(char*) × 2) + ALIGN(length_of_row
+1, sizeof(char*))
ALIGN()
ist ein Rundungsfaktor, der
gewährleisten soll, dass die Zeilenlänge ein Vielfaches der
char
-Pointergröße ist.
sizeof(char*)
ist auf 32-Bit-Rechnern
gleich 4 und auf 64-Bit-Rechnern gleich 8.
Ein spezielles Forum zur Speicher-Engine
MEMORY
finden Sie unter
http://forums.mysql.com/list.php?92.
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.