die kurze antwort:
select ENGINE, TABLE_NAME,Round( DATA_LENGTH/1024/1024) as data_length , round(INDEX_LENGTH/1024/1024) as index_length, round(DATA_FREE/ 1024/1024) as data_free from information_schema.tables where DATA_FREE > 0;
Die Antwort "Sie müssen wissen"
Zunächst müssen Sie verstehen, dass MySQL-Tabellen fragmentiert werden, wenn eine Zeile aktualisiert wird. Dies ist also eine normale Situation. Wenn eine Tabelle erstellt wird, z. B. mithilfe eines Speicherauszugs mit Daten importiert, werden alle Zeilen ohne Fragmentierung in vielen Seiten mit fester Größe gespeichert. Wenn Sie eine Zeile mit variabler Länge aktualisieren, wird die Seite, die diese Zeile enthält, in zwei oder mehr Seiten unterteilt, um die Änderungen zu speichern. Diese neuen zwei (oder mehr) Seiten enthalten Leerzeichen, die den nicht verwendeten Platz ausfüllen.
Dies wirkt sich nicht auf die Leistung aus, es sei denn, die Fragmentierung wächst zu stark. Was zu viel Fragmentierung ist, sehen wir uns die gesuchte Abfrage an:
select ENGINE, TABLE_NAME,Round( DATA_LENGTH/1024/1024) as data_length , round(INDEX_LENGTH/1024/1024) as index_length, round(DATA_FREE/ 1024/1024) as data_free from information_schema.tables where DATA_FREE > 0;
DATA_LENGTH und INDEX_LENGTH sind der Speicherplatz, den Ihre Daten und Indizes belegen, und DATA_FREE ist die Gesamtmenge der Bytes, die auf allen Tabellenseiten nicht verwendet werden (Fragmentierung).
Hier ist ein Beispiel einer realen Produktionstabelle
| ENGINE | TABLE_NAME | data_length | index_length | data_free |
| InnoDB | comments | 896 | 316 | 5 |
In diesem Fall haben wir eine Tabelle mit (896 + 316) = 1212 MB und Daten mit einem freien Speicherplatz von 5 MB. Dies bedeutet ein "Fragmentierungsverhältnis" von:
5/1212 = 0.0041
... Das ist ein wirklich niedriger "Fragmentierungsgrad".
Ich habe mit Tabellen mit einem Verhältnis nahe 0,2 gearbeitet (dh 20% der Leerzeichen) und bei Abfragen nie eine Verlangsamung festgestellt, auch wenn ich die Tabelle optimiere, ist die Leistung gleich. Das Anwenden einer Optimierungstabelle auf eine 800-MB-Tabelle nimmt jedoch viel Zeit in Anspruch und blockiert die Tabelle für einige Minuten, was für die Produktion nicht praktikabel ist.
Wenn Sie also überlegen, was Sie an Leistung und Zeit für die Optimierung eines Tisches gewinnen, bevorzuge ich NOT OPTIMIZE.
Wenn Sie der Meinung sind, dass der Speicher besser ist, überprüfen Sie Ihr Verhältnis und wie viel Speicherplatz Sie bei der Optimierung einsparen können. Es ist normalerweise nicht zu viel, deshalb ziehe ich es vor, NICHT OPTIMIEREN.
Und wenn Sie optimieren, werden beim nächsten Update Leerzeichen erstellt, indem Sie eine Seite in zwei oder mehr Seiten aufteilen. Es ist jedoch schneller, eine fragmentierte Tabelle zu aktualisieren, als eine nicht fragmentierte, da bei einer fragmentierten Tabelle eine Aktualisierung einer Zeile nicht unbedingt eine Seite aufteilt.
Ich hoffe das hilft dir.