Die folgende Liste gibt einige Möglichkeiten an, wie der mysqld-Server Speicher verwendet. Sofern anwendbar, wird der Name der Systemvariablen angegeben, die für die Speichernutzung relevant ist:
Der Schlüsselpuffer (Variable
key_buffer_size
) wird von allen Threads
gemeinsam verwendet. Andere Puffer, die der Server benutzt,
werden nach Bedarf zugewiesen. Siehe auch
Abschnitt 7.5.2, „Serverparameter feineinstellen“.
Jede Verbindung verwendet mehrere Thread-spezifische Bereiche:
einen Stapel (standardmäßig 192 Kbyte groß, Variable
thread_stack
)
einen Verbindungspuffer (Variable
net_buffer_length
)
einen Ergebnispuffer (Variable
net_buffer_length
)
Verbindungs- und Ergebnispuffer werden nach Bedarf dynamisch
bis auf den durch max_allowed_packet
angegebenen Wert vergrößert. Während der Ausführung
einer Abfrage wird eine Kopie des aktuellen Abfrage-Strings
ebenfalls reserviert.
Alle Threads verwenden denselben Basisspeicher.
Wenn ein Thread nicht mehr benötigt wird, wird der ihm zugewiesene Speicher freigegeben und dem System zurückgegeben, sofern der Thread nicht zurück in den Thread-Cache wandert (in diesem Fall bleibt der Speicher reserviert).
Vor MySQL 5.1.4 wurden nur für komprimierte
MyISAM
-Tabellen Speicher zugeordnet. Seit
MySQL 5.1.4 lässt sich die Systemvariable
myisam_use_mmap
auf 1 setzen, um die
Speicherzuordnung für alle
MyISAM
-Tabellen zu aktivieren.
Abschnitt 5.2.2, „Server-Systemvariablen“.
Jede Anforderung, die einen sequenziellen Scan einer Tabelle
durchführt, reserviert einen
Lesepuffer (Variable
read_buffer_size
).
Beim Lesen von Datensätzen in willkürlicher Folge (z. B.
nach einer Sortierung) kann ein
Zufallslesepuffer reserviert werden,
um Festplattenzugriffe zu umgehen (Variable
read_rnd_buffer_size
).
Alle Joins werden in einem einzigen Durchlauf ausgeführt,
und die meisten Joins können sogar ohne Temporärtabelle
erledigt werden. Die meisten Temporärtabellen sind
speicherbasierte Hash-Tabellen. Temporärtabellen mit einer
großen Datensatzlänge (berechnet als Summe aller
Spaltenlängen) oder solche, die
BLOB
-Spalten enthalten, werden auf der
Festplatte gespeichert.
Wenn eine interne HEAP-Tabelle die durch
tmp_table_size
angegebene Größe
überschreitet, macht MySQL die HEAP-Tabelle im Speicher
nach Bedarf automatisch zu einer festplattenbasierten
MyISAM
-Tabelle. Sie können auch die
Größe der Temporärtabelle erhöhen, indem Sie die
mysqld-Option
tmp_table_size
oder die SQL-Option
SQL_BIG_TABLES
im Clientprogramm
einstellen. Siehe auch Abschnitt 13.5.3, „SET
“.
Die meisten Anforderungen, die eine Sortierung durchführen, reservieren einen Sortierpuffer und abhängig von der Größe der Ergebnismenge null bis zwei Temporärdateien. Siehe auch Abschnitt A.4.4, „Wohin MySQL temporäre Dateien speichert“.
Praktisch die gesamte Analyse und Berechnung erfolgt in
einem lokalen Speicherbereich. Bei kleinen Elementen ist
keine Speichermehrbelastung gegeben, d. h., die normale
langsame Speicherreservierung und -freigabe werden umgangen.
Speicher wird nur für unerwartet große Strings reserviert.
Dies wird mit malloc()
und
free()
bewerkstelligt.
Für jede MyISAM
-Tabelle, die geöffnet
wird, wird die Indexdatei einmal geöffnet. Die Datendatei
wird für jeden gleichzeitig laufenden Thread einmal
geöffnet. Für jeden nebenläufigen Thread werden eine
Tabellenstruktur, Spaltenstrukturen für jede Spalte und ein
Puffer der Größe 3 ×
reserviert. (Hierbei
ist N
N
die maximale
Datensatzlänge abzüglich vorhandener
BLOB
-Spalten.) Eine
BLOB
-Spalte erfordert fünf bis acht Byte
zuzüglich der Länge der BLOB
-Daten. Die
MyISAM
-Speicher-Engine unterhält einen
zusätzlichen Puffer zur internen Verwendung.
Bei Tabellen mit BLOB
-Spalten wird ein
Puffer dynamisch vergrößert, um größere
BLOB
-Werte einlesen zu können. Wenn Sie
eine Tabelle scannen, wird ein Puffer reserviert, der so
groß ist wie der größte BLOB
-Wert.
Handler-Strukturen für alle in Verwendung befindlichen Tabellen werden in einem Cache gespeichert und als FIFO verwaltet. Standardmäßig hat der Cache 64 Einträge. Wenn eine Tabelle von zwei laufenden Threads gleichzeitig verwendet wurde, enthält der Cache zwei Einträge für die Tabelle. Siehe auch Abschnitt 7.4.8, „Nachteile der Erzeugung großer Mengen von Tabellen in derselben Datenbank“.
Eine FLUSH TABLES
-Anweisung oder der
Befehl mysqladmin flush-tables schließt
alle Tabellen, die gerade nicht verwendet werden, und
kennzeichnet alle in Verwendung befindlichen Tabellen, damit
diese geschlossen werden, sobald der ausführende Thread
endet. Hierdurch wird der größte Teil des in Verwendung
befindlichen Speichers freigegeben. FLUSH
TABLES
wird erst abgeschlossen, wenn alle Tabellen
geschlossen wurden.
ps und andere Systemstatusprogramme melden
unter Umständen, dass mysqld viel Speicher
benötigt. Dies kann von Thread-Stapeln an verschiedenen
Speicheradressen verursacht werden. Die Solaris-Version von
ps beispielsweise zählt die Menge des nicht
verwendeten Speichers zwischen den Stapeln als verwendeten
Speicher. Sie können dies überprüfen, indem Sie den
verfügbaren Auslagerungsspeicher mit swap -s
verifizieren. Wir testen mysqld mit
verschiedenen Speicherleckdetektoren (sowohl kommerzieller als
auch freier Herkunft), d. h., es sollten keine Speicherlecks
vorhanden sein.
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.