Ich habe viel darüber recherchiert, wie Indizes in MySQL verwaltet werden können, um eine Fragmentierung zu verhindern und die Ausführung einiger Abfragen irgendwie zu optimieren.
Ich kenne diese Formel, die das Verhältnis zwischen dem für eine Tabelle maximal verfügbaren Speicherplatz und dem von Daten und Indizes verwendeten Speicherplatz berechnet.
Meine Hauptfragen sind jedoch noch unbeantwortet. Vielleicht liegt dies an der Tatsache, dass ich mit der Indexpflege in SQL Server vertraut bin und ich denke, dass sie in MySQL irgendwie ähnlich sein sollte.
In SQL Server können mehrere Indizes vorhanden sein, von denen jeder unterschiedliche Fragmentierungsstufen aufweisen kann. Dann können Sie eine auswählen und eine 'REORGANIZE'- oder' REBUILD'-Operation in diesem bestimmten Index ausführen, ohne den Rest zu beeinflussen.
Nach meinem besten Wissen gibt es keine "Tabellenfragmentierung" als solche, und SQL Server bietet kein Tool zum Beheben der "Tabellenfragmentierung". Es werden Tools zum Überprüfen der Indexfragmentierung (verstanden als Verhältnis zwischen der Anzahl der von einem Index verwendeten Seiten und der Fülle dieser Seite und der Kontiguität) sowie der internen und externen Fragmentierung bereitgestellt.
All das ist ziemlich einfach zu verstehen, zumindest für mich.
Wenn es darum geht, Indizes in MySQL zu verwalten, gibt es nur das oben erwähnte Konzept der Tabellenfragmentierung.
Eine Tabelle in MySQL kann mehrere Indizes haben, aber wenn ich das Fragmentierungsverhältnis mit dieser berühmten Formel überprüfe, sehe ich nicht die Fragmentierung jedes Index, sondern die Tabelle als Ganzes.
Wenn ich die Indizes in MySQL optimieren möchte, wähle ich keinen bestimmten Index für die Bearbeitung aus (wie in SQL Server). Stattdessen führe ich eine 'OPTIMIZE'-Operation in der gesamten Tabelle aus, die vermutlich alle Indizes betrifft.
Wenn die Tabelle in MySQL optimiert wird, wird das Verhältnis zwischen dem von Daten + Indizes verwendeten Speicherplatz und dem Gesamtspeicherplatz reduziert, was auf eine physische Neuorganisation der Festplatte hindeutet, was sich in einer Reduzierung des physischen Speicherplatzes niederschlägt. Bei der Indexfragmentierung geht es jedoch nicht nur um den physischen Speicherplatz, sondern auch um die Struktur des Baums, die im Laufe der Zeit aufgrund von Einfügungen und Aktualisierungen geändert wurde.
Endlich habe ich eine Tabelle in InnoDB / MySQL bekommen. Diese Tabelle enthält 3 Millionen Datensätze, 105 Spalten und 55 Indizes. Es sind 1,5 GB ohne Indizes, die 2,1 GB betragen.
Diese Tabelle wird tausende Male am Tag zum Aktualisieren und Einfügen aufgerufen (wir löschen keine Datensätze).
Diese Tabelle wurde jahrelang erstellt und ich weiß mit Sicherheit, dass niemand Indizes verwaltet.
Ich hatte erwartet, dort eine große Fragmentierung zu finden, aber wenn ich die Fragmentierungsberechnung wie vorgeschrieben durchführe
free_space / (data_length + index_length)
Es stellt sich heraus, dass ich nur eine Fragmentierung von 0,2% habe. IMHO ist das ziemlich unrealistisch.
Die großen Fragen sind also:
- Wie überprüfe ich die Fragmentierung eines bestimmten Index in MySQL, nicht der gesamten Tabelle?
- Behebt OPTIMIZE TABLE tatsächlich die interne / externe Fragmentierung eines Index wie in SQL Server?
- Wenn ich eine Tabelle in MySQL optimiere, werden dann tatsächlich alle Indizes in der Tabelle neu erstellt?
- Ist es realistisch zu glauben, dass die Reduzierung des physischen Speicherplatzes eines Index (ohne den Baum selbst neu zu erstellen) tatsächlich zu einer besseren Leistung führt?