Eine der einfacheren Optimierungen besteht darin, Ihre Tabellen so zu implementieren, dass sie möglichst wenig Platz auf der Festplatte einnehmen. Dies kann erhebliche Verbesserungen zur Folge haben, weil die Lesevorgänge von der Festplatte schneller erfolgen und kleinere Tabellen normalerweise weniger Hauptspeicher benötigen, während ihre Inhalte bei der Abfrageausführung aktiv verarbeitet werden. Auch die Indizierung ist weniger ressourcenbeanspruchend, wenn sie an schmaleren Spalten vorgenommen wird.
MySQL unterstützt viele verschiedene Speicher-Engines (Tabellentypen) und Datensatzformate. Für jede Tabelle können Sie neu entscheiden, welche Speicher- und Indizierungsmethode verwendet werden soll. Die Auswahl des für Ihre Anwendung geeigneten Tabellenformats kann Ihnen einen erheblichen Performancezuwachs bringen. Siehe auch Kapitel 14, Speicher-Engines und Tabellentypen.
Sie können die Leistungsfähigkeit Ihrer Tabellen optimieren und den Speicherbedarf minimieren, indem Sie die folgenden Methoden benutzen:
Verwenden Sie den jeweils effizientesten (d. h.
kleinstmöglichen) Datentyp. MySQL bietet viele
Spezialtypen, mit denen sich Festplatten- und
Arbeitsspeicher einsparen lassen. Setzen Sie beispielsweise
möglichst die kleineren Integer-Typen ein, um kleinere
Tabellen zu erhalten. MEDIUMINT
ist
häufig besser geeignet als INT
, weil
eine MEDIUMINT
-Spalte 25 Prozent weniger
Platz benötigt.
Wenn möglich, deklarieren Sie Spalten als NOT
NULL
. Hierdurch wird alles schneller, und Sie
sparen ein Bit je Spalte. Wenn Sie NULL
in Ihrer Anwendung wirklich benötigen, sollten Sie es
natürlich benutzen; Sie sollten lediglich verhindern, dass
alle Spalten vorgabeseitig so eingestellt sind.
Wenn Ihre MyISAM
-Tabellen keine Spalten
variabler Länge (VARCHAR
,
TEXT
oder BLOB
)
enthalten, wird ein festes Datensatzformat verwendet. Dieses
ist schneller, kann allerdings mehr Platz beanspruchen.
Siehe auch Abschnitt 14.1.3, „MyISAM-Tabellenformate“.
Sie können mit der Option
ROW_FORMAT=FIXED
für CREATE
TABLE
angeben, dass Sie Datensätze fester Länge
verwenden wollen, auch wenn
VARCHAR
-Spalten vorhanden sind.
InnoDB
-Tabellen verwenden ein kompaktes
Speicherformat. In Versionen vor MySQL 5.0.3 enthalten
InnoDB
-Datensätze einige redundante
Informationen, z. B. die Anzahl und die Längen der
einzelnen Spalten (und zwar auch bei Spalten fester
Größe). Standardmäßig werden Tabellen im kompakten
Format erstellt (ROW_FORMAT=COMPACT
).
Wenn Sie ein Downgrade auf eine ältere MySQL-Version
durchführen wollen, können Sie das alte Format mit
ROW_FORMAT=REDUNDANT
anfordern.
Das kompakte InnoDB
-Format ändert auch
die Art und Weise, wie CHAR
-Spalten, die
Daten im UTF-8-Format enthalten, gespeichert werden. Bei
ROW_FORMAT=REDUNDANT
belegt eine Spalte
CHAR(
im
UTF-8-Format 3 × N
)N
Byte
(davon ausgehend, dass die maximale Länge eines
UTF-8-kodierten Zeichens drei Byte beträgt). Viele Sprachen
können vorwiegend mit UTF-8-Zeichen geschrieben werden, die
nur ein Byte umfassen, weswegen eine feste Speicherlänge
häufig Platzverschwendung ist. Beim
ROW_FORMAT=COMPACT
-Format reserviert
InnoDB
eine variable Speichermenge im
Bereich zwischen N
und 3 ×
N
Byte für diese Spalten, indem
Leerzeichen am Ende nach Bedarf abgeschnitten werden. Die
Mindestspeichergröße wird als N
Byte vermerkt, um in typischen Fällen interne Updates
durchführen zu können.
Der Primärindex einer Tabelle sollte so kurz wie möglich sein. Dies macht die Identifizierung eines Datensatzes einfach und effizient.
Erstellen Sie nur Indizes, die Sie auch wirklich benötigen. Indizes sind praktisch, um Daten abzurufen, aber von Nachteil, wenn Sie Daten schnell speichern müssen. Wenn Sie auf eine Tabelle in erster Linie durch das Durchsuchen einer Kombination von Spalten zugreifen, dann erstellen Sie für diese Kombination einen Index. Der erste Teil des Indexes sollte die meistverwendete Spalte sein. Wenn Sie beim Auswählen aus der Tabelle immer viele Spalten verwenden, sollten Sie die Spalte benutzen, die mehr Dubletten aufweist, damit der Index besser komprimiert werden kann.
Wenn es sehr wahrscheinlich ist, dass eine String-Spalte ein
eindeutiges Präfix innerhalb der ersten paar Zeichen
aufweist, dann ist es besser, nur dieses Präfix zu
indizieren. Hierzu verwenden Sie die MySQL-Funktionalität
zur Erstellung eines Indexes aus dem linken Teil der Spalte
(siehe Abschnitt 13.1.4, „CREATE INDEX
“). Kürzere Indizes
sind nicht nur deswegen schneller, weil sie weniger
Festplattenkapazität benötigen, sondern auch, weil sie auf
diese Weise mehr Treffer im Index-Cache erhalten (d. h., es
sind weniger Suchvorgänge auf der Festplatte erforderlich).
Siehe auch Abschnitt 7.5.2, „Serverparameter feineinstellen“.
Unter manchen Umständen kann es von Vorteil sein, eine Tabelle, die sehr häufig gescannt wird, in zwei Tabellen aufzutrennen. Dies gilt insbesondere, wenn es sich um eine Tabelle im dynamischen Format handelt und es möglich ist, dass eine kleinere statische Tabelle entsteht, die beim Scannen der Tabelle zum Auffinden der gewünschten Datensätze benutzt werden kann.
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.