360 MySQL - Technische Referenz f¨ur Version 5.0.1-alpha
• Den meisten Sortier-Anfragen werden ein Sortierpuffer und 0 bis 2 tempor¨are Dateien
zugewiesen, abh¨angig von der Gr¨oße der Ergebnismenge. Siehe Abschnitt A.4.4 [Tem-
porary files], Seite 638.
• Fast alles Parsen und Berechnen wird in einem lokalen Speicherb ereich durchgef¨uhrt.
F¨ur kleine Sachen wird kein Speicher-Overhead ben¨otigt, und das normale, langsame
Zuweisen und Freimachen von Speicher wird vermieden. Speicher wird nur f¨ur uner-
wartet lange Zeichenketten zugewiesen (das wird mit malloc() und free() gemacht).
• Jede Index-Datei wird einmal ge¨offnet. Die Daten-Datei wird einmal f¨ur jeden
gleichzeitig laufenden Thread ge¨offnet. F¨ur jeden gleichzeitigen Thread wird eine
Tabellenstruktur, Spaltenstrukturen f¨ur jede Spalte und ein Puffer der Gr¨oße 3 *
n zugewiesen, wobei n die maximale Zeilenl¨ange ist (BLOB-Spalten werden nicht
mitgerechnet). Eine BLOB-Spalte benutzt 5 bis 8 Bytes plus die L¨ange der BLOB-Daten.
Der ISAM- / MyISAM-Tabellen-Handler benutzt einen zus¨atzlichen Zeilenpuffer f¨ur
internen Gebrauch.
• Bei jeder Tabelle, die BLOB-Spalten enth¨alt, wird ein Puffer dynamisch vergr¨oßert, um
gr¨oßere BLOB-Werte einzulesen. Wenn Sie eine Tabelle scannen, wird ein Puffer so Groß
wie der gr¨oßte BLOB-Wert zugewiesen.
• Tabellen-Handler f¨ur alle Tabellen in Benutzung werden in einem Cache gespeichert
und als FIFO verwaltet. Normalerweise hat der Cache 64 Eintr¨age. Wenn eine Tabelle
gleichzeitig von zwei laufenden Threads benutzt wurde, enth¨alt der Cache zwei Eintr¨age
f¨ur die Tabelle. Siehe Abschnitt 6.4.6 [Open tables], Seite 353.
• Ein mysqladmin flush-tables-Befehl schließt alle Tabellen, die nicht in Benutzung
sind, und kennzeichnet alle Tabellen in Benutzung als zu schließen, sobald der aktuell
ausf¨uhrende Thread fertig ist. Das setzt effektiv den meisten benutzten Speicher frei.
ps und andere System-Status-Programme berichten vielleicht, dass mysqld viel Arbeitsspe-
icher benutzt. Das kann durch Thread-Stacks auf verschiedenen Speicheradressen verursacht
werden. ps der Solaris-Version zum Beispiel z¨ahlt den unbenutzten Speicher zwischen Stacks
zum benutzten Speicher hinzu. Das k¨onnen Sie best¨atigen, wenn Sie den verf¨ugbaren Swap
mit swap -s ¨uberpr¨ufen. Wir haben mysqld mit kommerziellen Memory-Leak-Detektoren
getestet, daher sollte es keine Memory-Leaks geben.
6.5.5 Wie MySQL DNS benutzt
Wenn sich ein neuer Thread mit mysqld verbindet, erzeugt mysqld einen neuen Thread, um
die Anfrage zu handhaben. Dieser Thread pr¨uft zuerst, ob der Hostname im Hostnamen-
Cache ist. Falls nicht, ruft der Thread gethostbyaddr_r() und gethostbyname_r() auf,
um den Hostname aufzul¨osen.
Wenn das Betriebssystem die oben genannten Thread-sicheren Aufrufe nicht unterst¨utzt,
sperrt der Thread ein Mutex und ruft statt dessen gethostbyaddr() und gethostbyname()
auf. Beachten Sie, dass in diesem Fall kein anderer Thread andere Hostnamen au߬osen kann,
die nicht im Hostnamen-Cache sind, bis der erste Thread fertig ist.
Sie k¨onnen das DNS-Nachschlagen von Hostnamen (DNS-Lookup) abschalten, indem
Sie mysqld mit --skip-name-resolve starten. In diesem Fall k¨onnen Sie jedoch in den
MySQL-Berechtigungstabellen nur IP-Nummern verwenden.
Kommentare zu diesen Handbüchern